snapcast_control/protocol/
client.rs

1use serde::{Deserialize, Serialize};
2
3// the snapclient
4/// A client connected to the Snapcast server
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub struct Client {
7  pub id: String,
8  pub connected: bool,
9  pub config: ClientConfig,
10  pub host: Host,
11  pub snapclient: Snapclient,
12  #[serde(rename = "lastSeen")]
13  pub last_seen: LastSeen,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17pub struct Host {
18  pub arch: String,
19  pub ip: String,
20  pub mac: String,
21  pub name: String,
22  pub os: String,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
26pub struct ClientConfig {
27  pub instance: usize,
28  pub latency: usize,
29  pub name: String,
30  pub volume: ClientVolume,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34pub struct ClientVolume {
35  pub muted: bool,
36  pub percent: usize,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
40pub struct Snapclient {
41  pub name: String,
42  #[serde(rename = "protocolVersion")]
43  pub protocol_version: usize,
44  pub version: String,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
48pub struct LastSeen {
49  pub sec: usize,
50  pub usec: usize,
51}
52
53// params and results
54#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
55pub struct GetStatusParams {
56  pub id: String,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
60pub struct GetStatusResult {
61  pub client: Client,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
65pub struct SetVolumeParams {
66  pub id: String,
67  pub volume: ClientVolume,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
71pub struct SetVolumeResult {
72  pub volume: ClientVolume,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
76pub struct SetLatencyParams {
77  pub id: String,
78  pub latency: usize,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
82pub struct SetLatencyResult {
83  pub latency: usize,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
87pub struct SetNameParams {
88  pub id: String,
89  pub name: String,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
93pub struct SetNameResult {
94  pub name: String,
95}
96
97// notifications
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
99pub struct OnConnectParams {
100  pub id: String,
101  pub client: Client,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
105pub struct OnDisconnectParams {
106  pub id: String,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
110pub struct OnVolumeChangedParams {
111  pub id: String,
112  pub volume: ClientVolume,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
116pub struct OnLatencyChangedParams {
117  pub id: String,
118  pub latency: usize,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
122pub struct OnNameChangedParams {
123  pub id: String,
124  pub name: String,
125}
126
127#[cfg(test)]
128mod tests {
129  use super::*;
130
131  #[test]
132  fn serialize_host() {
133    let host = Host {
134      arch: "x86_64".to_string(),
135      ip: "127.0.0.1".to_string(),
136      mac: "00:21:6a:7d:74:fc".to_string(),
137      name: "T400".to_string(),
138      os: "Linux Mint 17.3 Rosa".to_string(),
139    };
140
141    let json = serde_json::to_string(&host).unwrap();
142    let expected =
143      r#"{"arch":"x86_64","ip":"127.0.0.1","mac":"00:21:6a:7d:74:fc","name":"T400","os":"Linux Mint 17.3 Rosa"}"#;
144
145    assert_eq!(json, expected);
146  }
147
148  #[test]
149  fn deserialize_host() {
150    let json =
151      r#"{"arch":"x86_64","ip":"127.0.0.1","mac":"00:21:6a:7d:74:fc","name":"T400","os":"Linux Mint 17.3 Rosa"}"#;
152    let host: Host = serde_json::from_str(json).unwrap();
153
154    assert_eq!(host.mac, "00:21:6a:7d:74:fc");
155  }
156
157  #[test]
158  fn serialize_client() {
159    let client = Client {
160      id: "00:21:6a:7d:74:fc#2".to_string(),
161      connected: true,
162      config: ClientConfig {
163        instance: 2,
164        latency: 6,
165        name: "123 456".to_string(),
166        volume: ClientVolume {
167          muted: false,
168          percent: 48,
169        },
170      },
171      host: Host {
172        arch: "x86_64".to_string(),
173        ip: "127.0.0.1".to_string(),
174        mac: "00:21:6a:7d:74:fc".to_string(),
175        name: "T400".to_string(),
176        os: "Linux Mint 17.3 Rosa".to_string(),
177      },
178      snapclient: Snapclient {
179        name: "Snapclient".to_string(),
180        protocol_version: 2,
181        version: "0.10.0".to_string(),
182      },
183      last_seen: LastSeen {
184        sec: 1488025901,
185        usec: 864472,
186      },
187    };
188
189    let json = serde_json::to_string(&client).unwrap();
190    let expected = r#"{"id":"00:21:6a:7d:74:fc#2","connected":true,"config":{"instance":2,"latency":6,"name":"123 456","volume":{"muted":false,"percent":48}},"host":{"arch":"x86_64","ip":"127.0.0.1","mac":"00:21:6a:7d:74:fc","name":"T400","os":"Linux Mint 17.3 Rosa"},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.10.0"},"lastSeen":{"sec":1488025901,"usec":864472}}"#;
191
192    assert_eq!(json, expected);
193  }
194
195  #[test]
196  fn deserialize_client() {
197    let json = r#"{"config":{"instance":2,"latency":6,"name":"123 456","volume":{"muted":false,"percent":48}},"connected":true,"host":{"arch":"x86_64","ip":"127.0.0.1","mac":"00:21:6a:7d:74:fc","name":"T400","os":"Linux Mint 17.3 Rosa"},"id":"00:21:6a:7d:74:fc#2","lastSeen":{"sec":1488025901,"usec":864472},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.10.0"}}"#;
198    let client: Client = serde_json::from_str(json).unwrap();
199
200    assert_eq!(client.id, "00:21:6a:7d:74:fc#2");
201  }
202}