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}