json_utils/schema/
object_node.rs1use 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);