use serde::{Deserialize, Serialize};
use crate::SonosClient;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct AVTransportState {
pub transport_state: Option<String>,
pub transport_status: Option<String>,
pub speed: Option<String>,
pub current_track_uri: Option<String>,
pub track_duration: Option<String>,
pub track_metadata: Option<String>,
pub rel_time: Option<String>,
pub abs_time: Option<String>,
pub rel_count: Option<u32>,
pub abs_count: Option<u32>,
pub play_mode: Option<String>,
pub next_track_uri: Option<String>,
pub next_track_metadata: Option<String>,
pub queue_length: Option<u32>,
}
pub fn poll(client: &SonosClient, ip: &str) -> crate::Result<AVTransportState> {
let transport = client.execute_enhanced(
ip,
super::get_transport_info_operation()
.build()
.map_err(|e| crate::ApiError::ParseError(e.to_string()))?,
)?;
let position = super::get_position_info_operation()
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
let settings = super::get_transport_settings_operation()
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
let media = super::get_media_info_operation()
.build()
.ok()
.and_then(|op| client.execute_enhanced(ip, op).ok());
Ok(AVTransportState {
transport_state: Some(transport.current_transport_state),
transport_status: Some(transport.current_transport_status),
speed: Some(transport.current_speed),
current_track_uri: position.as_ref().map(|p| p.track_uri.clone()),
track_duration: position.as_ref().map(|p| p.track_duration.clone()),
track_metadata: position.as_ref().map(|p| p.track_meta_data.clone()),
rel_time: position.as_ref().map(|p| p.rel_time.clone()),
abs_time: position.as_ref().map(|p| p.abs_time.clone()),
rel_count: position
.as_ref()
.and_then(|p| u32::try_from(p.rel_count).ok()),
abs_count: position
.as_ref()
.and_then(|p| u32::try_from(p.abs_count).ok()),
play_mode: settings.map(|s| s.play_mode),
next_track_uri: media.as_ref().map(|m| m.next_uri.clone()),
next_track_metadata: media.as_ref().map(|m| m.next_uri_meta_data.clone()),
queue_length: media.map(|m| m.nr_tracks),
})
}