use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ServerStatus {
pub server: Server,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Server {
pub server: ServerInfo,
pub groups: Vec<Group>,
pub streams: Vec<Stream>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ServerInfo {
pub host: Host,
pub snapserver: Snapserver,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Snapserver {
pub name: String,
#[serde(rename = "protocolVersion")]
pub protocol_version: u32,
#[serde(rename = "controlProtocolVersion")]
pub control_protocol_version: u32,
pub version: String,
}
impl Default for Snapserver {
fn default() -> Self {
Self {
name: "snapcast-rs".into(),
protocol_version: 2,
control_protocol_version: 1,
version: env!("CARGO_PKG_VERSION").into(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Host {
#[serde(default)]
pub arch: String,
#[serde(default)]
pub ip: String,
#[serde(default)]
pub mac: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub os: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Client {
pub id: String,
pub connected: bool,
pub config: ClientConfig,
pub host: Host,
#[serde(default)]
pub snapclient: Snapclient,
#[serde(default, rename = "lastSeen")]
pub last_seen: LastSeen,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientConfig {
#[serde(default)]
pub instance: u32,
pub latency: i32,
pub name: String,
pub volume: Volume,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Volume {
pub muted: bool,
pub percent: u16,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Snapclient {
#[serde(default)]
pub name: String,
#[serde(default, rename = "protocolVersion")]
pub protocol_version: u32,
#[serde(default)]
pub version: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LastSeen {
#[serde(default)]
pub sec: u64,
#[serde(default)]
pub usec: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Group {
pub id: String,
pub name: String,
pub stream_id: String,
pub muted: bool,
pub clients: Vec<Client>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Stream {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub properties: Option<StreamProperties>,
pub status: StreamStatus,
pub uri: StreamUri,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum StreamStatus {
#[default]
Idle,
Playing,
Disabled,
Unknown,
}
impl From<&str> for StreamStatus {
fn from(s: &str) -> Self {
match s {
"playing" => Self::Playing,
"idle" => Self::Idle,
"disabled" => Self::Disabled,
_ => Self::Unknown,
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StreamUri {
#[serde(default)]
pub fragment: String,
#[serde(default)]
pub host: String,
#[serde(default)]
pub path: String,
#[serde(default)]
pub query: HashMap<String, String>,
pub raw: String,
#[serde(default)]
pub scheme: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StreamProperties {
#[serde(default)]
pub playback_status: Option<String>,
#[serde(default)]
pub loop_status: Option<String>,
#[serde(default)]
pub shuffle: Option<bool>,
#[serde(default)]
pub volume: Option<u16>,
#[serde(default)]
pub mute: Option<bool>,
#[serde(default)]
pub rate: Option<f64>,
#[serde(default)]
pub position: Option<f64>,
#[serde(default)]
pub can_go_next: bool,
#[serde(default)]
pub can_go_previous: bool,
#[serde(default)]
pub can_play: bool,
#[serde(default)]
pub can_pause: bool,
#[serde(default)]
pub can_seek: bool,
#[serde(default)]
pub can_control: bool,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}