1use std::collections::HashMap;
7
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, Default, Serialize, Deserialize)]
12pub struct ServerStatus {
13 pub server: Server,
15}
16
17#[derive(Debug, Clone, Default, Serialize, Deserialize)]
19pub struct Server {
20 pub server: ServerInfo,
22 pub groups: Vec<Group>,
24 pub streams: Vec<Stream>,
26}
27
28#[derive(Debug, Clone, Default, Serialize, Deserialize)]
30pub struct ServerInfo {
31 pub host: Host,
33 pub snapserver: Snapserver,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct Snapserver {
40 pub name: String,
42 #[serde(rename = "protocolVersion")]
44 pub protocol_version: u32,
45 #[serde(rename = "controlProtocolVersion")]
47 pub control_protocol_version: u32,
48 pub version: String,
50}
51
52impl Default for Snapserver {
53 fn default() -> Self {
54 Self {
55 name: "snapcast-rs".into(),
56 protocol_version: 2,
57 control_protocol_version: 1,
58 version: env!("CARGO_PKG_VERSION").into(),
59 }
60 }
61}
62
63#[derive(Debug, Clone, Default, Serialize, Deserialize)]
67pub struct Host {
68 #[serde(default)]
70 pub arch: String,
71 #[serde(default)]
73 pub ip: String,
74 #[serde(default)]
76 pub mac: String,
77 #[serde(default)]
79 pub name: String,
80 #[serde(default)]
82 pub os: String,
83}
84
85#[derive(Debug, Clone, Default, Serialize, Deserialize)]
89pub struct Client {
90 pub id: String,
92 pub connected: bool,
94 pub config: ClientConfig,
96 pub host: Host,
98 #[serde(default)]
100 pub snapclient: Snapclient,
101 #[serde(default, rename = "lastSeen")]
103 pub last_seen: LastSeen,
104}
105
106#[derive(Debug, Clone, Default, Serialize, Deserialize)]
108pub struct ClientConfig {
109 #[serde(default)]
111 pub instance: u32,
112 pub latency: i32,
114 pub name: String,
116 pub volume: Volume,
118}
119
120#[derive(Debug, Clone, Default, Serialize, Deserialize)]
122pub struct Volume {
123 pub muted: bool,
125 pub percent: u16,
127}
128
129#[derive(Debug, Clone, Default, Serialize, Deserialize)]
131pub struct Snapclient {
132 #[serde(default)]
134 pub name: String,
135 #[serde(default, rename = "protocolVersion")]
137 pub protocol_version: u32,
138 #[serde(default)]
140 pub version: String,
141}
142
143#[derive(Debug, Clone, Default, Serialize, Deserialize)]
145pub struct LastSeen {
146 #[serde(default)]
148 pub sec: u64,
149 #[serde(default)]
151 pub usec: u64,
152}
153
154#[derive(Debug, Clone, Default, Serialize, Deserialize)]
158pub struct Group {
159 pub id: String,
161 pub name: String,
163 pub stream_id: String,
165 pub muted: bool,
167 pub clients: Vec<Client>,
169}
170
171#[derive(Debug, Clone, Default, Serialize, Deserialize)]
175pub struct Stream {
176 pub id: String,
178 #[serde(default, skip_serializing_if = "Option::is_none")]
180 pub properties: Option<StreamProperties>,
181 pub status: StreamStatus,
183 pub uri: StreamUri,
185}
186
187#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
189#[serde(rename_all = "lowercase")]
190pub enum StreamStatus {
191 #[default]
193 Idle,
194 Playing,
196 Disabled,
198 Unknown,
200}
201
202impl From<&str> for StreamStatus {
203 fn from(s: &str) -> Self {
204 match s {
205 "playing" => Self::Playing,
206 "idle" => Self::Idle,
207 "disabled" => Self::Disabled,
208 _ => Self::Unknown,
209 }
210 }
211}
212
213#[derive(Debug, Clone, Default, Serialize, Deserialize)]
215pub struct StreamUri {
216 #[serde(default)]
218 pub fragment: String,
219 #[serde(default)]
221 pub host: String,
222 #[serde(default)]
224 pub path: String,
225 #[serde(default)]
227 pub query: HashMap<String, String>,
228 pub raw: String,
230 #[serde(default)]
232 pub scheme: String,
233}
234
235#[derive(Debug, Clone, Default, Serialize, Deserialize)]
237pub struct StreamProperties {
238 #[serde(default)]
240 pub playback_status: Option<String>,
241 #[serde(default)]
243 pub loop_status: Option<String>,
244 #[serde(default)]
246 pub shuffle: Option<bool>,
247 #[serde(default)]
249 pub volume: Option<u16>,
250 #[serde(default)]
252 pub mute: Option<bool>,
253 #[serde(default)]
255 pub rate: Option<f64>,
256 #[serde(default)]
258 pub position: Option<f64>,
259 #[serde(default)]
261 pub can_go_next: bool,
262 #[serde(default)]
264 pub can_go_previous: bool,
265 #[serde(default)]
267 pub can_play: bool,
268 #[serde(default)]
270 pub can_pause: bool,
271 #[serde(default)]
273 pub can_seek: bool,
274 #[serde(default)]
276 pub can_control: bool,
277 #[serde(default)]
279 pub metadata: Option<serde_json::Value>,
280}