json_utils/schema/
object_node.rs

1use std::collections::HashMap;
2use std::collections::HashSet;
3
4use crate::json::JsValue;
5
6use super::SchemaNode;
7
8#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub struct ObjectNode {
10    pub properties: HashMap<String, SchemaNode>,
11
12    #[serde(default = "HashSet::new", skip_serializing_if = "HashSet::is_empty")]
13    pub required: HashSet<String>,
14
15    #[serde(skip_serializing_if = "HashMap::is_empty")]
16    #[serde(flatten)]
17    pub extra: HashMap<String, JsValue>,
18}
19
20impl ObjectNode {
21    pub fn with_properties(self, properties: HashMap<String, SchemaNode>) -> Self {
22        Self { properties, ..self }
23    }
24    pub fn add_property<S: Into<SchemaNode>>(mut self, key: &str, schema: S) -> Self {
25        self.properties.insert(key.to_owned(), schema.into());
26        self
27    }
28    pub fn rm_property(mut self, key: &str) -> Self {
29        self.properties.remove(key);
30        self
31    }
32
33    pub fn with_required(self, required: HashSet<String>) -> Self {
34        Self { required, ..self }
35    }
36    pub fn add_required(mut self, key: &str) -> Self {
37        self.required.insert(key.to_owned());
38        self
39    }
40    pub fn rm_required(mut self, key: &str) -> Self {
41        self.required.remove(key);
42        self
43    }
44}
45
46impl_extra_props!(ObjectNode, extra);