jsonpath_rust/parser/
macros.rs1use crate::parser::model::{
2 Comparable, Filter, FilterAtom, FnArg, Literal, Segment, Selector, SingularQuery, Test,
3};
4
5#[macro_export]
6macro_rules! lit {
7 () => {
8 Literal::Null
9 };
10 (b$b:expr ) => {
11 Literal::Bool($b)
12 };
13 (s$s:expr) => {
14 Literal::String($s.to_string())
15 };
16 (i$n:expr) => {
17 Literal::Int($n)
18 };
19 (f$n:expr) => {
20 Literal::Float($n)
21 };
22}
23
24#[macro_export]
25macro_rules! q_segments {
26 ($segment:tt) => {
27 vec![q_segment!($segment)]
28 };
29 ($segment:tt $($rest:tt)*) => {{
31 let mut segments = q_segments!($($rest)*);
32 segments.insert(0, q_segment!($segment));
33 segments
34 }};
35}
36
37#[macro_export]
38macro_rules! q_segment {
39 ($name:ident) => {
40 SingularQuerySegment::Name(stringify!($name).to_string())
41 };
42 ([$name:ident]) => {
43 SingularQuerySegment::Name(format!("\"{}\"", stringify!($name)))
44 };
45 ([$index:expr]) => {
46 SingularQuerySegment::Index($index)
47 };
48}
49#[macro_export]
50macro_rules! singular_query {
51 (@ $($segment:tt)*) => {
52 SingularQuery::Current(q_segments!($($segment)*))
53 };
54 ($($segment:tt)*) => {
55 SingularQuery::Root(q_segments!($($segment)*))
56 };
57}
58
59#[macro_export]
60macro_rules! slice {
61 () => {
62 (None, None, None)
63 };
64 ($start:expr) => {
65 (Some($start), None, None)
66 };
67 ($start:expr, $end:expr) => {
68 (Some($start), Some($end), None)
69 };
70 ($start:expr,, $step:expr) => {
71 (Some($start), None, Some($step))
72 };
73 (,, $step:expr) => {
74 (None, None, Some($step))
75 };
76 (, $end:expr) => {
77 (None, Some($end), None)
78 };
79 (, $end:expr,$step:expr ) => {
80 (None, Some($end), Some($step))
81 };
82 ($start:expr, $end:expr, $step:expr) => {
83 (Some($start), Some($end), Some($step))
84 };
85}
86
87#[macro_export]
88macro_rules! test_fn {
89 ($name:ident $arg:expr) => {
90 TestFunction::try_new(stringify!($name), vec![$arg]).unwrap()
91 };
92
93 ($name:ident $arg1:expr, $arg2:expr ) => {
94 TestFunction::try_new(stringify!($name), vec![$arg1, $arg2]).unwrap()
95 };
96}
97
98#[macro_export]
99macro_rules! arg {
100 ($arg:expr) => {
101 FnArg::Literal($arg)
102 };
103 (t $arg:expr) => {
104 FnArg::Test(Box::new($arg))
105 };
106 (f $arg:expr) => {
107 FnArg::Filter($arg)
108 };
109}
110
111#[macro_export]
112macro_rules! test {
113 (@ $($segments:expr)*) => { Test::RelQuery(vec![$($segments),*]) };
114 (S $jq:expr) => { Test::AbsQuery($jq) };
115 ($tf:expr) => { Test::Function(Box::new($tf)) };
116
117}
118
119#[macro_export]
120macro_rules! or {
121 ($($items:expr),*) => {
122 crate::parser::model::Filter::Or(vec![ $($items),* ])
123 };
124}
125
126#[macro_export]
127macro_rules! and {
128 ($($items:expr),*) => {
129 crate::parser::model::Filter::And(vec![ $($items),* ])
130 };
131}
132
133#[macro_export]
134macro_rules! filter_ {
135 ($item:expr) => {
136 crate::parser::model::Filter::Atom($item)
137 };
138
139 (or $($items:expr),*) => {
140 crate::parser::model::Filter::Or(vec![ $($items),* ])
141 };
142
143 (and $($items:expr),*) => {
144 crate::parser::model::Filter::And(vec![ $($items),* ])
145 };
146}
147
148#[macro_export]
149macro_rules! atom {
150 (! $filter:expr) => {
151 FilterAtom::filter($filter, true)
152 };
153 ($filter:expr) => {
154 FilterAtom::filter($filter, false)
155 };
156 (t! $filter:expr) => {
157 FilterAtom::test($filter, true)
158 };
159 (t $filter:expr) => {
160 FilterAtom::filter($filter, false)
161 };
162 ($lhs:expr, $s:expr, $rhs:expr) => {
163 FilterAtom::Comparison(Box::new(cmp!($lhs, $s, $rhs)))
164 };
165}
166
167#[macro_export]
168macro_rules! cmp {
169 ($lhs:expr, $op:expr , $rhs:expr) => {
170 Comparison::try_new($op, $lhs, $rhs).unwrap()
171 };
172}
173
174#[macro_export]
175macro_rules! comparable {
176 ($lit:expr) => {
177 Comparable::Literal($lit)
178 };
179 (f $func:expr) => {
180 Comparable::Function($func)
181 };
182 (> $sq:expr) => {
183 Comparable::SingularQuery($sq)
184 };
185}
186
187#[macro_export]
188macro_rules! selector {
189 (*) => {
190 Selector::Wildcard
191 };
192 (?$filter:expr) => {
193 Selector::Filter($filter)
194 };
195 (slice $slice:expr) => {
196 slice_from($slice)
197 };
198 ($name:ident) => {
199 Selector::Name(stringify!($name).to_string())
200 };
201 ([$name:ident]) => {
202 Selector::Name(format!("\"{}\"", stringify!($name)))
203 };
204 ([$index:expr]) => {
205 Selector::Index($index)
206 };
207}
208
209#[macro_export]
210macro_rules! segment {
211 (..$segment:expr) => {
212 Segment::Descendant(Box::new($segment))
213 };
214 ($selector:expr) => {
215 Segment::Selector($selector)
216 };
217 ($($selectors:expr),*) => {
218 Segment::Selectors(vec![$($selectors),*])
219 };
220}
221
222#[macro_export]
223macro_rules! jq {
224 ($($segment:expr),*) => {
225 JpQuery::new(vec![$($segment),*])
226 };
227}