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
14impl 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 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 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 pub fn null(&mut self) {
48 self.null = true;
49 }
50
51 pub fn skip(&mut self) {
53 self.skip = true;
54 }
55
56 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 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 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 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 pub fn set_json<N: Into<String>>(&mut self, name: N, value: Value) {
104 self.object.insert(name.into(), value);
105 }
106
107 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 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 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