use sonos_sdk::{SdkError, SonosSystem};
fn main() -> Result<(), SdkError> {
println!("Sonos SDK - DOM-like API Example");
println!("=================================");
println!("Discovering Sonos devices...");
let system = SonosSystem::new()?;
let speaker_names = system.speaker_names();
if speaker_names.is_empty() {
println!("No Sonos speakers found on the network");
println!("Make sure speakers are powered on and connected to the same network");
return Ok(());
}
println!(
"Found {} speakers: {}",
speaker_names.len(),
speaker_names.join(", ")
);
let speaker_name = &speaker_names[0];
let speaker = system
.speaker(speaker_name)
.ok_or_else(|| SdkError::SpeakerNotFound(speaker_name.clone()))?;
println!("\nUsing speaker: {} ({})", speaker.name, speaker.ip);
println!("Speaker ID: {}", speaker.id);
println!("\nVolume Property Methods:");
println!("========================");
println!("get() - Cached value:");
match speaker.volume.get() {
Some(vol) => println!(" Current volume: {}%", vol.0),
None => println!(" No cached volume available"),
}
println!("fetch() - Fresh from device:");
match speaker.volume.fetch() {
Ok(vol) => println!(" Fresh volume: {}%", vol.0),
Err(e) => println!(" Error fetching volume: {e}"),
}
println!("watch() - Register for changes:");
match speaker.volume.watch() {
Ok(handle) => {
println!(
" Started watching volume changes (mode: {})",
handle.mode()
);
if let Some(vol) = handle.value() {
println!(" Current volume: {}%", vol.0);
}
println!(" (Changes will appear in system.iter() while handle is alive)");
}
Err(e) => println!(" Error starting volume watcher: {e}"),
}
println!("\nPlayback State Property:");
println!("========================");
println!("get() - Cached playback state:");
match speaker.playback_state.get() {
Some(state) => println!(" Current state: {state:?}"),
None => println!(" No cached playback state available"),
}
println!("fetch() - Fresh playback state:");
match speaker.playback_state.fetch() {
Ok(state) => println!(" Fresh state: {state:?}"),
Err(e) => println!(" Error fetching playback state: {e}"),
}
println!("\nDOM-like API demonstration complete!");
println!("The API works exactly as designed:");
println!(" system.speaker(\"Speaker\").volume.get()");
println!(" system.speaker(\"Speaker\").volume.fetch()");
println!(" system.speaker(\"Speaker\").volume.watch()");
Ok(())
}