wled_json_api_library/structures/
info.rs1use serde;
2use serde::{Serialize, Deserialize};
3use serde_repr::{Deserialize_repr, Serialize_repr};
4use crate::errors::WledJsonApiError;
5use crate::structures::none_function;
6
7
8#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct Info {
11 #[serde(skip_serializing_if = "Option::is_none")]
13 #[serde(default = "none_function")]
14 pub ver: Option<String>,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 #[serde(default = "none_function")]
19 pub vid: Option<u32>,
20
21 #[serde(skip_serializing_if = "Option::is_none")]
23 #[serde(default = "none_function")]
24 pub leds: Option<Leds>,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
29 #[serde(default = "none_function")]
30 pub str: Option<bool>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
35 #[serde(default = "none_function")]
36 pub name: Option<String>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
41 #[serde(default = "none_function")]
42 pub udpport: Option<u16>,
43
44 #[serde(skip_serializing_if = "Option::is_none")]
46 #[serde(default = "none_function")]
47 pub live: Option<bool>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 #[serde(default = "none_function")]
52 pub liveseg: Option<i16>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
68 #[serde(default = "none_function")]
69 pub lm: Option<String>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 #[serde(default = "none_function")]
74 pub lip: Option<String>,
75
76 #[serde(skip_serializing_if = "Option::is_none")]
78 #[serde(default = "none_function")]
79 pub ws: Option<i8>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 #[serde(default = "none_function")]
84 pub fxcount: Option<u8>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
89 #[serde(default = "none_function")]
90 pub palcount: Option<u16>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
94 #[serde(default = "none_function")]
95 pub cpalcount: Option<u16>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
99 #[serde(default = "none_function")]
100 pub maps: Option<Vec<Map>>,
101
102 #[serde(skip_serializing_if = "Option::is_none")]
104 #[serde(default = "none_function")]
105 pub wifi: Option<Wifi>,
106
107 #[serde(skip_serializing_if = "Option::is_none")]
109 #[serde(default = "none_function")]
110 pub fs: Option<Fs>,
111
112 #[serde(skip_serializing_if = "Option::is_none")]
114 #[serde(default = "none_function")]
115 pub ndc: Option<i16>,
116
117 #[serde(skip_serializing_if = "Option::is_none")]
120 #[serde(default = "none_function")]
121 #[serde(rename = "txPower")]
122 pub tx_power: Option<u32>,
123
124 #[serde(skip_serializing_if = "Option::is_none")]
127 #[serde(default = "none_function")]
128 pub sleep: Option<bool>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
132 #[serde(default = "none_function")]
133 pub arch: Option<String>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
137 #[serde(default = "none_function")]
138 pub core: Option<String>,
139
140 #[serde(skip_serializing_if = "Option::is_none")]
143 #[serde(default = "none_function")]
144 #[serde(rename = "resetReason0")]
145 pub reset_reason_0: Option<u32>,
146
147 #[serde(skip_serializing_if = "Option::is_none")]
150 #[serde(default = "none_function")]
151 #[serde(rename = "resetReason1")]
152 pub reset_reason_1: Option<u32>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
157 #[serde(default = "none_function")]
158 #[serde(rename = "resetReason")]
159 pub reset_reason: Option<u32>,
160
161 #[serde(skip_serializing_if = "Option::is_none")]
163 #[serde(default = "none_function")]
164 pub lwip: Option<u8>,
165
166 #[serde(skip_serializing_if = "Option::is_none")]
168 #[serde(default = "none_function")]
169 pub freeheap: Option<u32>,
170
171 #[serde(skip_serializing_if = "Option::is_none")]
173 #[serde(default = "none_function")]
174 pub psram: Option<u64>,
175
176 #[serde(skip_serializing_if = "Option::is_none")]
178 #[serde(default = "none_function")]
179 pub uptime: Option<u32>,
180
181 #[serde(skip_serializing_if = "Option::is_none")]
183 #[serde(default = "none_function")]
184 pub time: Option<String>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
200 #[serde(default = "none_function")]
201 pub opt: Option<u16>,
202
203 #[serde(skip_serializing_if = "Option::is_none")]
205 #[serde(default = "none_function")]
206 pub brand: Option<String>,
207
208 #[serde(skip_serializing_if = "Option::is_none")]
210 #[serde(default = "none_function")]
211 pub product: Option<String>,
212
213 #[serde(skip_serializing_if = "Option::is_none")]
221 #[serde(default = "none_function")]
222 pub btype: Option<String>,
223
224 #[serde(skip_serializing_if = "Option::is_none")]
226 #[serde(default = "none_function")]
227 pub mac: Option<String>,
228
229 #[serde(skip_serializing_if = "Option::is_none")]
232 #[serde(default = "none_function")]
233 pub ip: Option<String>,
234}
235
236impl TryFrom<&str> for Info{
237 type Error = WledJsonApiError;
238 fn try_from(str_in: &str) -> Result<Info, WledJsonApiError> {
239 serde_json::from_str(str_in).map_err(|e| {WledJsonApiError::SerdeError(e)})
240 }
241}
242
243#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
244#[serde(rename_all = "camelCase")]
245pub struct Leds {
246 #[serde(skip_serializing_if = "Option::is_none")]
249 #[serde(default = "none_function")]
250 pub count: Option<u16>,
251
252 #[serde(skip_serializing_if = "Option::is_none")]
255 #[serde(default = "none_function")]
256 pub pwr: Option<u16>,
257
258 #[serde(skip_serializing_if = "Option::is_none")]
263 #[serde(default = "none_function")]
264 pub fps: Option<u16>,
265
266 #[serde(skip_serializing_if = "Option::is_none")]
268 #[serde(default = "none_function")]
269 pub maxpwr: Option<u16>,
270
271 #[serde(skip_serializing_if = "Option::is_none")]
274 #[serde(default = "none_function")]
275 pub maxseg: Option<u8>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
279 #[serde(default = "none_function")]
280 pub matrix: Option<MatrixDims>,
281
282 #[serde(skip_serializing_if = "Option::is_none")]
288 #[serde(default = "none_function")]
289 pub seglc: Option<Vec<u8>>,
290
291 #[serde(skip_serializing_if = "Option::is_none")]
293 #[serde(default = "none_function")]
294 pub lc: Option<u8>,
295
296 #[serde(skip_serializing_if = "Option::is_none")]
298 #[serde(default = "none_function")]
299 pub rgbw: Option<bool>,
300
301 #[serde(skip_serializing_if = "Option::is_none")]
303 #[serde(default = "none_function")]
304 pub wv: Option<u8>,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
308 #[serde(default = "none_function")]
309 pub cct: Option<u8>,
310
311 #[serde(skip_serializing_if = "Option::is_none")]
313 #[serde(default = "none_function")]
314 pub pin: Option<Vec<i8>>,
315
316 #[serde(skip_serializing_if = "Option::is_none")]
319 #[serde(default = "none_function")]
320 pub i2c: Option<[i8; 2]>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
325 #[serde(default = "none_function")]
326 pub spi: Option<[i8; 3]>,
327}
328
329#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
330#[serde(rename_all = "camelCase")]
331pub struct Map {
332 #[serde(skip_serializing_if = "Option::is_none")]
334 #[serde(default = "none_function")]
335 pub id: Option<u8>,
336
337 #[serde(skip_serializing_if = "Option::is_none")]
340 #[serde(default = "none_function")]
341 pub n: Option<String>,
342}
343
344#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
345#[serde(rename_all = "camelCase")]
346pub struct Wifi {
347 #[serde(skip_serializing_if = "Option::is_none")]
349 #[serde(default = "none_function")]
350 pub bssid: Option<String>,
351
352 #[serde(skip_serializing_if = "Option::is_none")]
359 #[serde(default = "none_function")]
360 pub rssi: Option<i64>,
361
362 #[serde(skip_serializing_if = "Option::is_none")]
365 #[serde(default = "none_function")]
366 pub signal: Option<u8>,
367
368 #[serde(skip_serializing_if = "Option::is_none")]
370 #[serde(default = "none_function")]
371 pub channel: Option<i32>,
372}
373
374#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
375#[serde(rename_all = "camelCase")]
376pub struct Fs {
377 #[serde(skip_serializing_if = "Option::is_none")]
379 #[serde(default = "none_function")]
380 pub u: Option<u32>,
381
382 #[serde(skip_serializing_if = "Option::is_none")]
384 #[serde(default = "none_function")]
385 pub t: Option<u32>,
386
387 #[serde(skip_serializing_if = "Option::is_none")]
390 #[serde(default = "none_function")]
391 pub pmt: Option<u64>,
392}
393
394#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
396#[serde(rename_all = "camelCase")]
397pub struct MatrixDims {
398 #[serde(skip_serializing_if = "Option::is_none")]
400 #[serde(default = "none_function")]
401 pub w: Option<u16>,
402
403 #[serde(skip_serializing_if = "Option::is_none")]
405 #[serde(default = "none_function")]
406 pub h: Option<u16>,
407}
408
409
410#[allow(non_camel_case_types)]
415#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug, Clone)]
416#[repr(u8)]
417pub enum SegmentLightCapability {
418 SEG_CAPABILITY_RGB = 0x01,
419 SEG_CAPABILITY_W = 0x02,
420 SEG_CAPABILITY_CCT = 0x04,
421}
422
423#[cfg(test)]
424mod tests {
425 use crate::structures::info::Info;
426
427 #[test]
428 fn it_works() {
429 let a: Info = Info::try_from(r#"{"ver":"0.14.0","vid":2310130,"leds":{"count":6,"pwr":0,"fps":5,"maxpwr":0,"maxseg":32,"seglc":[1],"lc":1,"rgbw":false,"wv":0,"cct":0},"str":false,"name":"WLED","udpport":21324,"live":false,"liveseg":-1,"lm":"","lip":"","ws":0,"fxcount":187,"palcount":71,"cpalcount":0,"maps":[{"id":0}],"wifi":{"bssid":"FC:EC:DA:A4:C4:77","rssi":-60,"signal":80,"channel":1},"fs":{"u":12,"t":983,"pmt":0},"ndc":0,"arch":"esp32","core":"v3.3.6-16-gcc5440f6a2","lwip":0,"freeheap":200300,"uptime":6,"time":"1970-1-1, 00:00:06","opt":79,"brand":"WLED","product":"FOSS","mac":"a842e38d9828","ip":"192.168.1.40"}"#).unwrap();
430 println!("{:?}", a);
431 }
432}