1#[macro_export]
38macro_rules! object {
39 {} => { $crate::Object::new() };
41
42 {
44 $( $key: ident $(: $value: expr)? ),* $(,)?
45 } => {{
46 let mut hm = $crate::Object::new();
47 $(
48 object!(@entry hm, $key $(: $value)?);
49 )*
50 hm
51 }};
52
53 (@entry $hm: expr,
55 $key: ident
56 ) => {
57 $hm.insert(String::from(stringify!($key)), $crate::json!($key));
58 };
59
60 (@entry $hm: expr,
62 $key: ident : $value: expr
63 ) => {
64 $hm.insert(String::from(stringify!($key)), $crate::json!($value));
65 };
66}
67
68macro_rules! try_unwrap {
75 (
76 $option: expr,
77 else Err($err: ident) => $block: block
78 $(,)?
79 ) => {
80 match $option {
81 Ok(value) => value,
82 Err($err) => $block,
83 }
84 };
85
86 (
87 $option: expr,
88 else Err($err: ident) => $stmt: stmt
89 $(,)?
90 ) => {
91 match $option {
92 Ok(value) => value,
93 #[rustfmt::skip] Err($err) => { $stmt },
95 }
96 };
97}
98
99macro_rules! fail {
103 ( $kind: ident ) => {
104 Err($crate::Error::$kind)
105 };
106 ( $kind: ident, $( $arg: expr ),* ) => {
107 Err($crate::Error::$kind( $( $arg ),* ))
108 };
109}
110
111macro_rules! io_fail {
115 ( $kind: ident ) => {
116 Err($crate::Error::IoFail($crate::IoError::$kind))
117 };
118 ( $kind: ident, $( $arg: expr ),* ) => {
119 Err($crate::Error::IoFail($crate::IoError::$kind( $( $arg ),* )))
120 };
121}
122
123#[cfg(test)]
124mod tests {
125 use crate::{Object, Value};
126
127 #[test]
128 fn object_macro_works() {
129 let my_key = "hello!";
130
131 let mut obj = Object::new();
132 obj.insert("abc".to_string(), Value::from(123));
133 obj.insert("array".to_string(), Value::from(vec![4, 5, 6]));
134 obj.insert("my_key".to_string(), Value::from(my_key));
135
136 assert_eq!(
137 object! {
138 abc: 123,
139 array: Value::from(vec![4, 5, 6]),
140 my_key,
141 },
142 obj
143 );
144
145 let mut obj = Object::new();
146 obj.insert("abc".to_string(), Value::from("abcdef"));
147
148 let mut obj2 = Object::new();
149 obj2.insert("ghi".to_string(), Value::from(456));
150
151 obj.insert("def".to_string(), Value::Object(obj2));
152
153 assert_eq!(
154 object! {
155 abc: Value::from("abcdef"),
156 def: Value::from(object!{
157 ghi: 456,
158 }),
159 },
160 obj
161 );
162 }
163
164 #[test]
165 fn try_unwrap_works() {
166 let result: Result<i32, &str> = Ok(123);
167 let value = try_unwrap!( result,
168 else Err(_err) => {
169 panic!("Should not be Err")
170 }
171 );
172 assert_eq!(value, 123);
173
174 let result: Result<i32, &str> = Err("oh no!");
175 let value = try_unwrap!( result,
176 else Err(_err) => {
177 456
178 }
179 );
180 assert_eq!(value, 456);
181
182 let result: Result<i32, &str> = Err("oh no!");
183 let _value = try_unwrap!( result,
184 else Err(_err) => {
185 return;
186 }
187 );
188 panic!("Should not have been Ok");
189 }
190}