1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use time::OffsetDateTime;
5use url::Url;
6
7use crate::Hateoas;
8use crate::azel::Location;
9
10#[cfg(feature = "serde")]
11use super::utils;
12
13#[cfg_attr(
14 feature = "serde",
15 derive(Serialize, Deserialize),
16 serde(rename_all = "camelCase")
17)]
18#[derive(Debug, Clone, PartialEq, Eq)]
19#[cfg_attr(not(feature = "unstable"), non_exhaustive)]
20pub struct SiteHardware {
21 pub manual: bool,
22 #[cfg_attr(feature = "serde", serde(default))]
23 pub ip: Option<String>,
24 pub name: String,
25 #[cfg_attr(feature = "serde", serde(default))]
26 pub specifications: Option<String>,
27 #[cfg_attr(feature = "serde", serde(default))]
28 pub manufacturer: Option<String>,
29 #[cfg_attr(feature = "serde", serde(default))]
30 pub model: Option<String>,
31 #[cfg_attr(feature = "serde", serde(with = "time::serde::iso8601"))]
32 pub created: OffsetDateTime,
33 #[cfg_attr(
34 feature = "serde",
35 serde(default, with = "time::serde::iso8601::option")
36 )]
37 pub modified: Option<OffsetDateTime>,
38 #[cfg_attr(feature = "serde", serde(rename = "type", default))]
39 pub typ: Option<String>,
40 #[cfg_attr(feature = "serde", serde(default))]
41 pub port_comms: Option<u16>,
42 #[cfg_attr(feature = "serde", serde(default))]
43 pub properties: Option<HashMap<String, String>>,
44}
45
46#[cfg_attr(
47 feature = "serde",
48 derive(Serialize, Deserialize),
49 serde(rename_all = "camelCase")
50)]
51#[derive(Debug, Clone, PartialEq)]
52#[cfg_attr(not(feature = "unstable"), non_exhaustive)]
53pub struct Site {
54 #[cfg_attr(feature = "serde", serde(with = "time::serde::iso8601"))]
55 pub created: OffsetDateTime,
56 #[cfg_attr(
57 feature = "serde",
58 serde(default, with = "time::serde::iso8601::option")
59 )]
60 pub modified: Option<OffsetDateTime>,
61 #[cfg_attr(feature = "serde", serde(default))]
62 pub internal_meta_data: Option<HashMap<String, String>>,
63 pub name: String,
64 #[cfg_attr(feature = "serde", serde(default))]
65 pub description: Option<String>,
66 pub location: Location,
67 pub base_fps_port: i32,
68 #[cfg_attr(feature = "serde", serde(default))]
69 pub properties: Option<HashMap<String, String>>,
70 #[cfg_attr(
71 feature = "serde",
72 serde(rename = "_links", with = "utils::links::serde", default)
73 )]
74 pub links: HashMap<String, Url>,
75}
76
77impl Hateoas for Site {
78 fn get_links(&self) -> &HashMap<String, url::Url> {
79 &self.links
80 }
81
82 fn get_links_mut(&mut self) -> &mut HashMap<String, url::Url> {
83 &mut self.links
84 }
85}
86
87#[cfg_attr(
88 feature = "serde",
89 derive(Serialize, Deserialize),
90 serde(rename_all = "camelCase")
91)]
92#[derive(Debug, Clone, PartialEq, Eq)]
93#[cfg_attr(not(feature = "unstable"), non_exhaustive)]
94pub struct SiteConfiguration {
95 #[cfg_attr(feature = "serde", serde(with = "time::serde::iso8601"))]
96 pub created: OffsetDateTime,
97 #[cfg_attr(
98 feature = "serde",
99 serde(default, with = "time::serde::iso8601::option")
100 )]
101 pub modified: Option<OffsetDateTime>,
102 #[cfg_attr(feature = "serde", serde(default))]
103 pub internal_meta_data: Option<HashMap<String, String>>,
104 pub name: String,
105 #[cfg_attr(feature = "serde", serde(default))]
106 pub description: Option<String>,
107 pub configuration_seconds: i32,
108 #[cfg_attr(feature = "serde", serde(rename = "virtual", default))]
109 pub virtual_cfg: Option<bool>,
110 #[cfg_attr(feature = "serde", serde(default))]
111 pub properties: Option<HashMap<String, String>>,
112 #[cfg_attr(feature = "serde", serde(default))]
113 pub hardware: Option<Vec<SiteHardware>>,
114 #[cfg_attr(
115 feature = "serde",
116 serde(rename = "_links", with = "utils::links::serde", default)
117 )]
118 pub links: HashMap<String, Url>,
119}
120
121impl Hateoas for SiteConfiguration {
122 fn get_links(&self) -> &HashMap<String, url::Url> {
123 &self.links
124 }
125
126 fn get_links_mut(&mut self) -> &mut HashMap<String, url::Url> {
127 &mut self.links
128 }
129}
130
131#[cfg(all(test, feature = "serde"))]
132mod tests {
133 use super::*;
134
135 #[test]
136 fn missing_option() {
137 let string = r#"
138 {
139 "manual": true,
140 "name": "Testing",
141 "created": "2020-08-12T04:05:20Z"
142 }
143 "#;
144 serde_json::from_str::<SiteHardware>(string).unwrap();
145 }
146}