1use serde::{Deserialize, Serialize};
2
3#[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#[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#[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}