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::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}