1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use std::collections::HashMap;

use serde::Deserialize;

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct LaserMetrics {
    pub rooms: Vec<RoomMetrics>,
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct RoomMetrics {
    pub room: String,
    #[serde(flatten)]
    pub api: RoomApiMetrics,
}

// FIXME: Once https://github.com/serde-rs/serde/pull/2525 and
// https://github.com/serde-rs/serde/issues/745 are merged/fixed, we can
// hopefully do it like this:

// #[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
// #[serde(tag = "api_version")]
// pub enum RoomApiMetrics {
//     #[serde(rename = 1)]
//     V1(RoomV1Metrics),
//     #[serde(rename = 2)]
//     V2(RoomV2Metrics),
// }

// The untagged struct does not serialize correctly (it omits the api_version),
// therefore we intentionally leave the Serialize conformance out for now.

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
#[serde(untagged)]
pub enum RoomApiMetrics {
    V1(RoomV1Metrics),
    V2(RoomV2Metrics),
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct RoomV1Metrics {
    pub controller_metrics: BoardV1Metrics,
    pub lamp_metrics: HashMap<i32, BoardV1Metrics>,
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct BoardV1Metrics {
    pub id: i32,
    pub version: i32,
    pub uptime: i32,
    pub temperature: i32,
    pub init_temperature: i32,
    pub settings: String,
    pub timeout: i32,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub frames: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_responding: Option<bool>,
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct RoomV2Metrics {
    pub controller_metrics: ControllerV2Metrics,
    pub lamp_metrics: Vec<LampV2Metrics>,
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct ControllerV2Metrics {
    pub responding: bool,
    pub ping_latency_ms: f64,
    pub firmware_version: i32,
    pub uptime: i32,
    pub frames: i32,
    pub fps: i32,
    pub core_temperature: f64,
    pub board_temperature: f64,
    pub shunt_voltage: f64,
    pub voltage: f64,
    pub power: f64,
    pub current: f64,
}

#[derive(Debug, /* Serialize,*/ Deserialize, PartialEq, Clone)]
pub struct LampV2Metrics {
    pub responding: bool,
    pub firmware_version: i32,
    pub uptime: i32,
    pub timeout: i32,
    pub temperature: i32,
    pub fuse_tripped: bool,
    pub flashing_status: String,
}