Skip to main content

PropertyHandle

Struct PropertyHandle 

Source
pub struct PropertyHandle<P: SonosProperty> { /* private fields */ }
Expand description

Generic property handle providing get/fetch/watch/unwatch pattern

This is the core abstraction for the DOM-like API. Each property on a Speaker is accessed through a PropertyHandle that provides consistent methods for reading cached values, fetching fresh values, and watching for changes.

§Type Parameter

  • P: The property type, must implement SonosProperty

§Example

// Get cached value (instant, no network call)
let volume = speaker.volume.get();

// Fetch fresh value from device (blocking API call)
let fresh_volume = speaker.volume.fetch()?;

// Watch for changes — hold the handle to keep the subscription alive
let handle = speaker.volume.watch()?;
println!("Volume: {:?}", handle.value());
// Dropping handle starts 50ms grace period

Implementations§

Source§

impl<P: SonosProperty> PropertyHandle<P>

Source

pub fn new(context: Arc<SpeakerContext>) -> Self

Create a new PropertyHandle from a shared SpeakerContext

Source

pub fn get(&self) -> Option<P>

Get cached property value (sync, instant, no network call)

Returns the currently cached value for this property, or None if no value has been cached yet. This method never makes network calls.

§Example
if let Some(volume) = speaker.volume.get() {
    println!("Current volume: {}%", volume.value());
}
Source

pub fn watch(&self) -> Result<WatchHandle<P>, SdkError>

Start watching this property for changes (sync)

Returns a WatchHandle that keeps the subscription alive. Hold the handle for as long as you need updates — dropping it starts a 50ms grace period before the UPnP subscription is torn down.

§Example
// Watch returns a handle — hold it to keep the subscription alive
let volume = speaker.volume.watch()?;

// Access the current value via Deref
if let Some(v) = &*volume {
    println!("Volume: {}%", v.value());
}

// Changes will appear in system.iter() while the handle is alive
for event in system.iter() {
    // Re-watch each frame to refresh the snapshot
    let volume = speaker.volume.watch()?;
    println!("Volume: {:?}", volume.value());
}
Source

pub fn is_watched(&self) -> bool

Check if this property is currently being watched

Returns true while a WatchHandle for this property is alive, or during the grace period after the last handle was dropped.

§Example
let handle = speaker.volume.watch()?;
assert!(speaker.volume.is_watched());

drop(handle); // starts 50ms grace period
// is_watched() remains true during grace period
Source

pub fn speaker_id(&self) -> &SpeakerId

Get the speaker ID this handle is associated with

Source

pub fn speaker_ip(&self) -> IpAddr

Get the speaker IP address

Source§

impl<P: Fetchable> PropertyHandle<P>

Source

pub fn fetch(&self) -> Result<P, SdkError>

Fetch fresh value from device + update cache (sync)

This makes a synchronous UPnP call to the device and updates the local state cache with the result.

§Example
// Fetch fresh volume from device
let volume = speaker.volume.fetch()?;
println!("Current volume: {}%", volume.value());

// The cache is now updated, so get() returns the same value
assert_eq!(speaker.volume.get(), Some(volume));
Source§

impl PropertyHandle<GroupMembership>

Source

pub fn fetch(&self) -> Result<GroupMembership, SdkError>

Fetch fresh value from device using speaker context + update cache (sync)

The response is interpreted using the speaker_id to extract the relevant property value from the full topology response.

Trait Implementations§

Source§

impl<P: Clone + SonosProperty> Clone for PropertyHandle<P>

Source§

fn clone(&self) -> PropertyHandle<P>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<P> Freeze for PropertyHandle<P>

§

impl<P> !RefUnwindSafe for PropertyHandle<P>

§

impl<P> Send for PropertyHandle<P>

§

impl<P> Sync for PropertyHandle<P>

§

impl<P> Unpin for PropertyHandle<P>
where P: Unpin,

§

impl<P> UnsafeUnpin for PropertyHandle<P>

§

impl<P> !UnwindSafe for PropertyHandle<P>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more