jsonway/
object_builder.rs

1use serde_json::{Value, to_value};
2use serde::{Serialize, Serializer};
3
4pub type Object = ::serde_json::Map<String, Value>;
5use array_builder;
6
7pub struct ObjectBuilder {
8    pub object: Object,
9    pub null: bool,
10    pub skip: bool,
11    pub root: Option<String>
12}
13
14/// ObjectBuilder is used to produce JSON objects
15impl ObjectBuilder {
16    pub fn new() -> ObjectBuilder {
17        ObjectBuilder {
18            object: ::serde_json::Map::new(),
19            null: false,
20            skip: false,
21            root: None
22        }
23    }
24
25    /// Initialize builder with initial value.
26    pub fn from_json(object: Value) -> Option<ObjectBuilder> {
27        match object {
28            Value::Object(object) => Some(ObjectBuilder {
29                object: object,
30                null: false,
31                skip: false,
32                root: None
33            }),
34            _ => None
35        }
36    }
37
38    /// Create new builder, pass it to closure as mutable ref and return.
39    pub fn build<F>(builder: F) -> ObjectBuilder where F: FnOnce(&mut ObjectBuilder) {
40        let mut bldr = ObjectBuilder::new();
41        builder(&mut bldr);
42
43        bldr
44    }
45
46    /// It you call `null`, this object will be converted to null.
47    pub fn null(&mut self) {
48        self.null = true;
49    }
50
51    /// It you call `skip`, this object will be skipped.
52    pub fn skip(&mut self) {
53        self.skip = true;
54    }
55
56    // Set custom root for result Value object
57    pub fn root(&mut self, root: &str) {
58        self.root = Some(root.to_string());
59    }
60
61    pub fn has_root(&mut self) -> bool {
62        self.root.is_some()
63    }
64
65    /// Move out internal JSON value.
66    pub fn unwrap(self) -> Value {
67        if self.root.is_some() {
68            let mut obj = ::serde_json::Map::new();
69            let root = self.root.as_ref().unwrap().to_string();
70            let self_json = self.unwrap_internal();
71            obj.insert(root, self_json);
72            Value::Object(obj)
73        } else {
74            self.unwrap_internal()
75        }
76    }
77
78    #[inline]
79    fn unwrap_internal(self) -> Value {
80        if self.null {
81            Value::Null
82        } else {
83            Value::Object(self.object)
84        }
85    }
86}
87
88impl ObjectBuilder {
89    /// Set object's `name` field with something that can be
90    /// converted to Value value.
91    pub fn set<V: Serialize, N: Into<String>>(&mut self, name: N, value: V) {
92        self.set_json(name, to_value(&value).unwrap());
93    }
94
95    /// Stub for future use
96    pub fn call<V: Serialize, N: Into<String>>(&mut self, name: N, value: V) {
97        self.set(name, value);
98    }
99}
100
101impl ObjectBuilder {
102    /// Set object's `name` field with raw Value value.
103    pub fn set_json<N: Into<String>>(&mut self, name: N, value: Value) {
104        self.object.insert(name.into(), value);
105    }
106
107    /// Build new array and set object's `name` field with it.
108    pub fn array<N: Into<String>, F>(&mut self, name: N, builder: F) where F: FnOnce(&mut array_builder::ArrayBuilder) {
109        self.set(name.into(), array_builder::ArrayBuilder::build(builder).unwrap());
110    }
111
112    /// Build new object and set object's `name` field with it.
113    pub fn object<N: Into<String>, F>(&mut self, name: N, builder: F) where F: FnOnce(&mut ObjectBuilder) {
114        self.set(name.into(), ObjectBuilder::build(builder).unwrap());
115    }
116}
117
118impl Serialize for ObjectBuilder {
119    /// Copy self to new JSON instance.
120    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
121        let json_object = if self.null { Value::Null } else { to_value(&self.object).unwrap() };
122        json_object.serialize(serializer)
123    }
124}
125