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
15impl 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 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 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 pub fn push_json(&mut self, value: Value) {
50 self.array.push(value);
51 }
52
53 pub fn array<F>(&mut self, builder: F) where F: FnOnce(&mut ArrayBuilder) {
55 self.push(ArrayBuilder::build(builder).unwrap());
56 }
57
58 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 pub fn null(&mut self) {
66 self.null = true;
67 }
68
69 pub fn skip(&mut self) {
71 self.skip = true;
72 }
73
74 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 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 #[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 pub fn push<T: Serialize>(&mut self, value: T) {
110 self.push_json(to_value(&value).unwrap());
111 }
112}
113
114impl ArrayBuilder {
115
116 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 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 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 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}