1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
6pub struct Network {
7 pub url: String,
8 pub name: Option<String>,
9 #[serde(default)]
10 pub password: Option<String>,
11 #[serde(default)]
12 pub health: Option<NetworkHealth>,
13 #[serde(default)]
14 pub speed: Option<SpeedInfo>,
15 #[serde(default)]
16 pub clients: Option<ClientCount>,
17 #[serde(default)]
18 pub eeros: Option<EeroCount>,
19 #[serde(default)]
20 pub profiles: Option<ProfileCount>,
21 #[serde(default)]
22 pub dns: Option<serde_json::Value>,
23 #[serde(default)]
24 pub guest_network: Option<GuestNetwork>,
25 #[serde(default)]
26 pub sqm: Option<serde_json::Value>,
27 #[serde(default)]
28 pub band_steering: Option<serde_json::Value>,
29 #[serde(default)]
30 pub thread: Option<serde_json::Value>,
31 #[serde(default)]
32 pub upnp: Option<serde_json::Value>,
33 #[serde(default)]
34 pub ipv6: Option<serde_json::Value>,
35 #[serde(default)]
36 pub wpa3: Option<serde_json::Value>,
37 #[serde(default)]
38 pub target_firmware: Option<String>,
39 #[serde(default)]
40 pub updates: Option<serde_json::Value>,
41 #[serde(default)]
42 pub timezone: Option<Timezone>,
43 #[serde(default)]
44 pub premium_dns: Option<serde_json::Value>,
45 #[serde(default)]
46 pub premium_status: Option<String>,
47 #[serde(flatten)]
48 pub extra: HashMap<String, serde_json::Value>,
49}
50
51#[derive(Debug, Clone, Deserialize, Serialize)]
52pub struct NetworkHealth {
53 #[serde(default)]
54 pub internet: Option<HealthStatus>,
55 #[serde(default)]
56 pub eero_network: Option<HealthStatus>,
57}
58
59#[derive(Debug, Clone, Deserialize, Serialize)]
60pub struct HealthStatus {
61 pub status: Option<String>,
62 #[serde(flatten)]
63 pub extra: HashMap<String, serde_json::Value>,
64}
65
66#[derive(Debug, Clone, Deserialize, Serialize)]
67pub struct SpeedInfo {
68 pub down: Option<SpeedValue>,
69 pub up: Option<SpeedValue>,
70 #[serde(flatten)]
71 pub extra: HashMap<String, serde_json::Value>,
72}
73
74#[derive(Debug, Clone, Deserialize, Serialize)]
75pub struct SpeedValue {
76 pub value: Option<f64>,
77 pub units: Option<String>,
78}
79
80#[derive(Debug, Clone, Deserialize, Serialize)]
81pub struct ClientCount {
82 pub count: Option<u32>,
83 pub url: Option<String>,
84}
85
86#[derive(Debug, Clone, Deserialize, Serialize)]
87pub struct EeroCount {
88 pub count: Option<u32>,
89 #[serde(flatten)]
90 pub extra: HashMap<String, serde_json::Value>,
91}
92
93#[derive(Debug, Clone, Deserialize, Serialize)]
94pub struct ProfileCount {
95 pub count: Option<u32>,
96 pub url: Option<String>,
97}
98
99#[derive(Debug, Clone, Deserialize, Serialize)]
100pub struct GuestNetwork {
101 pub name: Option<String>,
102 pub password: Option<String>,
103 pub enabled: Option<bool>,
104 pub url: Option<String>,
105 #[serde(flatten)]
106 pub extra: HashMap<String, serde_json::Value>,
107}
108
109#[derive(Debug, Clone, Deserialize, Serialize)]
110pub struct Timezone {
111 pub value: Option<String>,
112 #[serde(flatten)]
113 pub extra: HashMap<String, serde_json::Value>,
114}
115
116#[derive(Debug, Clone, Default, Serialize)]
117pub struct NetworkUpdate {
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub name: Option<String>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub password: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub sqm: Option<bool>,
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub band_steering: Option<bool>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub thread: Option<bool>,
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub upnp: Option<bool>,
130 #[serde(skip_serializing_if = "Option::is_none")]
131 pub ipv6: Option<bool>,
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub wpa3: Option<bool>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub dns: Option<DnsUpdate>,
136}
137
138#[derive(Debug, Clone, Default, Serialize)]
139pub struct DnsUpdate {
140 #[serde(skip_serializing_if = "Option::is_none")]
141 pub parent: Option<String>,
142 #[serde(skip_serializing_if = "Option::is_none")]
143 pub custom: Option<bool>,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub caching: Option<bool>,
146}
147
148#[derive(Debug, Clone, Default, Serialize)]
149pub struct GuestNetworkUpdate {
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub name: Option<String>,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub password: Option<String>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 pub enabled: Option<bool>,
156}
157
158#[derive(Debug, Clone, Deserialize, Serialize)]
159pub struct SpeedTest {
160 #[serde(default)]
161 pub date: Option<String>,
162 #[serde(default)]
163 pub up_mbps: Option<f64>,
164 #[serde(default)]
165 pub down_mbps: Option<f64>,
166 #[serde(flatten)]
167 pub extra: HashMap<String, serde_json::Value>,
168}