jsonway/
array_builder.rs

1use serde_json::{Value, to_value};
2use serde::{Serialize, Serializer};
3
4pub type JsonArray = Vec<Value>;
5
6use object_builder;
7
8pub struct ArrayBuilder {
9    pub array: JsonArray,
10    pub null: bool,
11    pub skip: bool,
12    pub root: Option<String>
13}
14
15/// Use ArrayBuilder to produce JSON arrays
16impl ArrayBuilder {
17
18    pub fn new() -> ArrayBuilder {
19        ArrayBuilder {
20            array: vec![],
21            null: false,
22            skip: false,
23            root: None
24        }
25    }
26
27    /// Initialize builder with initial value.
28    pub fn from_json(array: Value) -> Option<ArrayBuilder> {
29        match array {
30            Value::Array(array) => Some(ArrayBuilder {
31                array: array,
32                null: false,
33                skip: false,
34                root: None
35            }),
36            _ => None
37        }
38    }
39
40    /// Create new ArrayBuilder, pass it to closure as mutable ref and return.
41    pub fn build<F>(builder: F) -> ArrayBuilder where F: FnOnce(&mut ArrayBuilder) {
42        let mut bldr = ArrayBuilder::new();
43        builder(&mut bldr);
44
45        bldr
46    }
47
48    /// Push JSON value to array.
49    pub fn push_json(&mut self, value: Value) {
50        self.array.push(value);
51    }
52
53    /// Create new array and push it.
54    pub fn array<F>(&mut self, builder: F) where F: FnOnce(&mut ArrayBuilder) {
55        self.push(ArrayBuilder::build(builder).unwrap());
56    }
57
58    /// Create new object and push it
59    pub fn object<F>(&mut self, builder: F) where F: FnOnce(&mut object_builder::ObjectBuilder) {
60        self.push(object_builder::ObjectBuilder::build(builder).unwrap());
61    }
62
63    /// It you call `null`, this array will be converted to null when converting
64    /// to raw JSON value.
65    pub fn null(&mut self) {
66        self.null = true;
67    }
68
69    /// It you call `skip`, this array will be skipped.
70    pub fn skip(&mut self) {
71        self.skip = true;
72    }
73
74    // Set custom root for result Value object
75    pub fn root(&mut self, root: &str) {
76        self.root = Some(root.to_string());
77    }
78
79    pub fn has_root(&mut self) -> bool {
80        self.root.is_some()
81    }
82
83    /// Move out internal JSON value.
84    pub fn unwrap(self) -> Value {
85        if self.root.is_some() {
86            let mut obj = ::serde_json::Map::new();
87            let root = self.root.as_ref().unwrap().to_string();
88            let self_json = self.unwrap_internal();
89            obj.insert(root, self_json);
90            Value::Object(obj)
91        } else {
92            self.unwrap_internal()
93        }
94    }
95
96    /// Move out internal JSON value.
97    #[inline]
98    fn unwrap_internal(self) -> Value {
99        if self.null {
100            Value::Null
101        } else {
102            Value::Array(self.array)
103        }
104    }
105}
106
107impl ArrayBuilder {
108    /// Push to array something that can be converted to JSON.
109    pub fn push<T: Serialize>(&mut self, value: T) {
110        self.push_json(to_value(&value).unwrap());
111    }
112}
113
114impl ArrayBuilder {
115
116    /// Fill this array by objects builded from iterator.
117    pub fn objects<A, T: Iterator<Item=A>, F>(&mut self, iter: T, func: F) where F: Fn(A, &mut object_builder::ObjectBuilder) {
118        for a in iter {
119            let mut bldr = object_builder::ObjectBuilder::new();
120            func(a, &mut bldr);
121            if !bldr.skip {
122                self.push(bldr.unwrap())
123            }
124        }
125    }
126
127    // Fill this array by arrays builded from iterator.
128    pub fn arrays<A, T: Iterator<Item=A>, F>(&mut self, iter: T, func: F) where F: Fn(A, &mut ArrayBuilder) {
129        for a in iter {
130            let mut bldr = ArrayBuilder::new();
131            func(a, &mut bldr);
132            if !bldr.skip {
133                self.push(bldr.unwrap())
134            }
135        }
136    }
137
138    /// Fill this array by JSON values builded from iterator.
139    pub fn map<A, T: Iterator<Item=A>, F>(&mut self, iter: T, func: F) where F: Fn(A) -> Value {
140        for a in iter {
141            self.push(func(a))
142        }
143    }
144}
145
146impl Serialize for ArrayBuilder {
147    /// Copy self to new JSON instance.
148    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
149        let json_object = if self.null { Value::Null } else { to_value(&self.array).unwrap() };
150        json_object.serialize(serializer)
151    }
152}