use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::SonosClient;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RenderingControlState {
pub master_volume: Option<String>,
pub master_mute: Option<String>,
pub lf_volume: Option<String>,
pub rf_volume: Option<String>,
pub lf_mute: Option<String>,
pub rf_mute: Option<String>,
pub bass: Option<String>,
pub treble: Option<String>,
pub loudness: Option<String>,
pub balance: Option<String>,
pub other_channels: HashMap<String, String>,
}
pub fn poll(client: &SonosClient, ip: &str) -> crate::Result<RenderingControlState> {
let volume = client.execute_enhanced(
ip,
super::get_volume_operation("Master".to_string())
.build()
.map_err(|e| crate::ApiError::ParseError(e.to_string()))?,
)?;
let mute = super::get_mute_operation("Master".to_string())
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
let bass = super::get_bass_operation()
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
let treble = super::get_treble_operation()
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
let loudness = super::get_loudness_operation("Master".to_string())
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
Ok(RenderingControlState {
master_volume: Some(volume.current_volume.to_string()),
master_mute: mute.map(|m| if m.current_mute { "1" } else { "0" }.to_string()),
bass: bass.map(|b| b.current_bass.to_string()),
treble: treble.map(|t| t.current_treble.to_string()),
loudness: loudness.map(|l| if l.current_loudness { "1" } else { "0" }.to_string()),
lf_volume: None,
rf_volume: None,
lf_mute: None,
rf_mute: None,
balance: None,
other_channels: HashMap::new(),
})
}