freedom_models/
site.rs

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}