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