use snapcast_control::{ConnectionStatus, SnapcastConnection, ValidMessage};
use tokio::sync::mpsc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let (status_tx, mut status_rx) = mpsc::unbounded_channel::<ConnectionStatus>();
let mut client = SnapcastConnection::builder()
.on_status_change(move |status| {
let _ = status_tx.send(status);
})
.connect("127.0.0.1:1705".parse()?)
.await?;
client.server_get_status().await?;
loop {
tokio::select! {
Some(status) = status_rx.recv() => {
match status {
ConnectionStatus::Connected => {
println!("[connection] connected to server");
if let Err(e) = client.server_get_status().await {
eprintln!("[connection] failed to refresh state: {}", e);
}
}
ConnectionStatus::Disconnected => {
println!("[connection] disconnected from server, reconnecting...");
}
ConnectionStatus::ReconnectFailed => {
println!("[connection] reconnection attempt failed, will retry...");
}
}
}
Some(results) = client.recv() => {
for result in results {
match result {
Ok(message) => {
match message {
ValidMessage::Result { result, .. } => {
println!("[message] result: {:?}", result);
}
ValidMessage::Notification { method, .. } => {
println!("[message] notification: {:?}", method);
}
}
}
Err(err) => {
eprintln!("[error] {}", err);
}
}
}
}
_ = tokio::signal::ctrl_c() => {
println!("shutting down");
return Ok(());
}
}
}
}