json_keypath_iter/style/builder.rs
1use super::*;
2
3/// Builder to customise path styling
4pub struct StyleBuilder<'a> {
5 object_key_prefix: Option<&'a str>,
6 object_key_suffix: Option<&'a str>,
7 object_keys_in_path: Option<bool>,
8 skip_object_parents: Option<bool>,
9 array_key_prefix: Option<&'a str>,
10 array_key_suffix: Option<&'a str>,
11 array_keys_in_path: Option<bool>,
12 skip_array_parents: Option<bool>,
13}
14
15impl<'a> StyleBuilder<'a> {
16 pub fn new() -> Self {
17 StyleBuilder {
18 object_key_prefix: None,
19 object_key_suffix: None,
20 object_keys_in_path: None,
21 skip_object_parents: None,
22 array_key_prefix: None,
23 array_key_suffix: None,
24 array_keys_in_path: None,
25 skip_array_parents: None,
26 }
27 }
28
29 /// Clears the currently specified object key prefix value
30 pub fn default_object_key_prefix(mut self) -> Self {
31 self.object_key_prefix = None;
32 self
33 }
34 /// Sets the object key prefix value
35 /// ```rust
36 /// use serde_json::json;
37 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
38 ///
39 /// let style: Style = StyleBuilder::new()
40 /// .object_key_prefix(">>>")
41 /// .build();
42 /// let value = json!({"apple": [1, true, "three"]});
43 /// let iter = Iterator::new(&value).use_style(style);
44 /// let items: Vec<_> = iter.collect();
45 ///
46 /// assert_eq!(items[0], Element { path: ">>>apple\"][0]".into(), indices: vec![0], value: &json!(1), });
47 /// ```
48 pub fn object_key_prefix(mut self, value: &'a str) -> Self {
49 self.object_key_prefix = Some(value);
50 self
51 }
52
53 /// Clears the currently specified object key suffix value
54 pub fn default_object_key_suffix(mut self) -> Self {
55 self.object_key_suffix = None;
56 self
57 }
58 /// Sets the object key suffix value
59 /// ```rust
60 /// use serde_json::json;
61 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
62 ///
63 /// let style: Style = StyleBuilder::new()
64 /// .object_key_suffix("$$$")
65 /// .build();
66 /// let value = json!({"apple": [1, true, "three"]});
67 /// let iter = Iterator::new(&value).use_style(style);
68 /// let items: Vec<_> = iter.collect();
69 ///
70 /// assert_eq!(items[0], Element { path: "[\"apple$$$[0]".into(), indices: vec![0], value: &json!(1), });
71 /// ```
72 pub fn object_key_suffix(mut self, value: &'a str) -> Self {
73 self.object_key_suffix = Some(value);
74 self
75 }
76
77 /// Clears whether to show or hide object key values in the Element path
78 pub fn default_object_keys_in_path(mut self) -> Self {
79 self.object_keys_in_path = None;
80 self
81 }
82 /// Sets the object key values to be visible in the Element path
83 /// ```rust
84 /// use serde_json::json;
85 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
86 ///
87 /// let style: Style = StyleBuilder::new()
88 /// .show_object_keys_in_path()
89 /// .build();
90 /// let value = json!({"apple": [1, true, "three"]});
91 /// let iter = Iterator::new(&value).use_style(style);
92 /// let items: Vec<_> = iter.collect();
93 ///
94 /// assert_eq!(items[0], Element { path: "[\"apple\"][0]".into(), indices: vec![0], value: &json!(1), });
95 /// ```
96 pub fn show_object_keys_in_path(mut self) -> Self {
97 self.object_keys_in_path = Some(true);
98 self
99 }
100 /// Sets the object key values to be hidden in the Element path
101 /// ```rust
102 /// use serde_json::json;
103 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
104 ///
105 /// let style: Style = StyleBuilder::new()
106 /// .hide_object_keys_in_path()
107 /// .build();
108 /// let value = json!({"apple": [1, true, "three"]});
109 /// let iter = Iterator::new(&value).use_style(style);
110 /// let items: Vec<_> = iter.collect();
111 ///
112 /// assert_eq!(items[0], Element { path: "[\"\"][0]".into(), indices: vec![0], value: &json!(1), });
113 /// ```
114 pub fn hide_object_keys_in_path(mut self) -> Self {
115 self.object_keys_in_path = Some(false);
116 self
117 }
118
119 /// Clears whether to skip or include values that are objects in the set of yielded values
120 pub fn default_object_parents(mut self) -> Self {
121 self.skip_object_parents = None;
122 self
123 }
124 /// Sets values that are objects to be yielded by the Iterator
125 /// ```rust
126 /// use serde_json::json;
127 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
128 ///
129 /// let style: Style = StyleBuilder::new()
130 /// .skip_object_parents()
131 /// .build();
132 /// let value = json!({"apple": [1, true, "three"]});
133 /// let iter = Iterator::new(&value).use_style(style);
134 /// let items: Vec<_> = iter.collect();
135 ///
136 /// assert_eq!(items[0], Element { path: "[\"apple\"][0]".into(), indices: vec![0], value: &json!(1), });
137 /// ```
138 pub fn skip_object_parents(mut self) -> Self {
139 self.skip_object_parents = Some(true);
140 self
141 }
142 /// Prevents values that are objects from being yielded by the Iterator
143 /// ```rust
144 /// use serde_json::json;
145 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
146 ///
147 /// let style: Style = StyleBuilder::new()
148 /// .include_object_parents()
149 /// .build();
150 /// let value = json!({"apple": [1, true, "three"]});
151 /// let iter = Iterator::new(&value).use_style(style);
152 /// let items: Vec<_> = iter.collect();
153 ///
154 /// assert_eq!(items[0], Element { path: "".into(), indices: vec![], value: &json!({"apple": [1, true, "three"]}), });
155 /// ```
156 pub fn include_object_parents(mut self) -> Self {
157 self.skip_object_parents = Some(false);
158 self
159 }
160
161 /// Clears the currently specified array_key_prefix value
162 pub fn default_array_key_prefix(mut self) -> Self {
163 self.array_key_prefix = None;
164 self
165 }
166 /// Sets the array_key_prefix value
167 /// ```rust
168 /// use serde_json::json;
169 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
170 ///
171 /// let style: Style = StyleBuilder::new()
172 /// .array_key_prefix(":::")
173 /// .build();
174 /// let value = json!({"apple": [1, true, "three"]});
175 /// let iter = Iterator::new(&value).use_style(style);
176 /// let items: Vec<_> = iter.collect();
177 ///
178 /// assert_eq!(items[0], Element { path: "[\"apple\"]:::0]".into(), indices: vec![0], value: &json!(1), });
179 /// ```
180 pub fn array_key_prefix(mut self, value: &'a str) -> Self {
181 self.array_key_prefix = Some(value);
182 self
183 }
184
185 /// Clears the currently specified array key suffix value
186 pub fn default_array_key_suffix(mut self) -> Self {
187 self.array_key_suffix = None;
188 self
189 }
190 /// Sets the array key suffix value
191 /// ```rust
192 /// use serde_json::json;
193 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
194 ///
195 /// let style: Style = StyleBuilder::new()
196 /// .array_key_suffix("!!!")
197 /// .build();
198 /// let value = json!({"apple": [1, true, "three"]});
199 /// let iter = Iterator::new(&value).use_style(style);
200 /// let items: Vec<_> = iter.collect();
201 ///
202 /// assert_eq!(items[0], Element { path: "[\"apple\"][0!!!".into(), indices: vec![0], value: &json!(1), });
203 /// ```
204 pub fn array_key_suffix(mut self, value: &'a str) -> Self {
205 self.array_key_suffix = Some(value);
206 self
207 }
208
209 /// Clears whether to show or hide array key values in the Element path
210 pub fn default_array_keys_in_path(mut self) -> Self {
211 self.array_keys_in_path = None;
212 self
213 }
214 /// Sets the array key values to be visible in the Element path
215 /// ```rust
216 /// use serde_json::json;
217 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
218 ///
219 /// let style: Style = StyleBuilder::new()
220 /// .show_array_keys_in_path()
221 /// .build();
222 /// let value = json!({"apple": [1, true, "three"]});
223 /// let iter = Iterator::new(&value).use_style(style);
224 /// let items: Vec<_> = iter.collect();
225 ///
226 /// assert_eq!(items[0], Element { path: "[\"apple\"][0]".into(), indices: vec![0], value: &json!(1), });
227 /// ```
228 pub fn show_array_keys_in_path(mut self) -> Self {
229 self.array_keys_in_path = Some(true);
230 self
231 }
232 /// Sets the array key values to be hidden in the Element path
233 /// ```rust
234 /// use serde_json::json;
235 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
236 ///
237 /// let style: Style = StyleBuilder::new()
238 /// .hide_array_keys_in_path()
239 /// .build();
240 /// let value = json!({"apple": [1, true, "three"]});
241 /// let iter = Iterator::new(&value).use_style(style);
242 /// let items: Vec<_> = iter.collect();
243 ///
244 /// assert_eq!(items[0], Element { path: "[\"apple\"][]".into(), indices: vec![0], value: &json!(1), });
245 /// ```
246 pub fn hide_array_keys_in_path(mut self) -> Self {
247 self.array_keys_in_path = Some(false);
248 self
249 }
250
251 /// Clears whether to skip or include values that are arrays in the set of yielded values
252 pub fn default_array_parents(mut self) -> Self {
253 self.skip_array_parents = None;
254 self
255 }
256 /// Sets values that are arrays to be yielded by the Iterator
257 /// ```rust
258 /// use serde_json::json;
259 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
260 ///
261 /// let style: Style = StyleBuilder::new()
262 /// .skip_array_parents()
263 /// .build();
264 /// let value = json!({"apple": [1, true, "three"]});
265 /// let iter = Iterator::new(&value).use_style(style);
266 /// let items: Vec<_> = iter.collect();
267 ///
268 /// assert_eq!(items[0], Element { path: "[\"apple\"][0]".into(), indices: vec![0], value: &json!(1), });
269 /// ```
270 pub fn skip_array_parents(mut self) -> Self {
271 self.skip_array_parents = Some(true);
272 self
273 }
274 /// Prevents values that are arrays from being yielded by the Iterator
275 /// ```rust
276 /// use serde_json::json;
277 /// use json_keypath_iter::{Style, StyleBuilder, Iterator, Element};
278 ///
279 /// let style: Style = StyleBuilder::new()
280 /// .include_array_parents()
281 /// .build();
282 /// let value = json!({"apple": [1, true, "three"]});
283 /// let iter = Iterator::new(&value).use_style(style);
284 /// let items: Vec<_> = iter.collect();
285 ///
286 /// assert_eq!(items[0], Element { path: "[\"apple\"]".into(), indices: vec![], value: &json!([1, true, "three"]), });
287 /// ```
288 pub fn include_array_parents(mut self) -> Self {
289 self.skip_array_parents = Some(false);
290 self
291 }
292
293 /// Builds a value Style with defaults for any value not specified or previously cleared out
294 pub fn build(&self) -> Style<'a> {
295 Style {
296 object_key_prefix: self.object_key_prefix.unwrap_or("[\""),
297 object_key_suffix: self.object_key_suffix.unwrap_or("\"]"),
298 object_keys_in_path: self.object_keys_in_path.unwrap_or(true),
299 skip_object_parents: self.skip_object_parents.unwrap_or(true),
300 array_key_prefix: self.array_key_prefix.unwrap_or("["),
301 array_key_suffix: self.array_key_suffix.unwrap_or("]"),
302 array_keys_in_path: self.array_keys_in_path.unwrap_or(true),
303 skip_array_parents: self.skip_array_parents.unwrap_or(true),
304 }
305 }
306}