1use crate::Error;
2
3pub fn parse_query_segments(query: &str) -> Result<(&str, Vec<&str>), Error> {
4 if query == "." {
8 return Ok(("", vec![]));
9 }
10
11 let base_query = if query.contains('|') {
13 query.split('|').next().unwrap().trim()
14 } else {
15 query
16 };
17
18 if base_query.starts_with(".[") {
22 let remaining = &base_query[1..];
23 let mut segments = remaining.split('.');
24 let first_segment = segments.next().unwrap();
25 let rest: Vec<&str> = segments.collect();
26 let result = Ok(("", vec![vec![first_segment], rest].concat()));
27 return result;
29 }
30
31 let mut segments = base_query.split('.').skip(1);
32 let segment = segments
33 .next()
34 .ok_or(Error::InvalidQuery("Missing field segment in query".into()))?;
35 let fields: Vec<&str> = segments.collect();
36
37 let result = Ok((segment, fields));
38 result
40}
41
42pub fn parse_array_segment(segment: &str) -> Result<(usize, usize), Error> {
43 let idx = segment
44 .find('[')
45 .ok_or(Error::InvalidQuery("Missing '[' in segment".into()))?;
46 let ridx = segment
47 .find(']')
48 .ok_or(Error::InvalidQuery("Missing ']' in segment".into()))?;
49
50 if idx >= ridx {
51 return Err(Error::InvalidQuery("Invalid bracket order".into()));
52 }
53
54 Ok((idx, ridx))
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60 use crate::Error;
61
62 #[test]
63 fn test_parse_query_segments_normal_case() {
64 let result = parse_query_segments(".users.name");
66 assert!(result.is_ok());
67 let (segment, field) = result.unwrap();
68 assert_eq!(segment, "users");
69 assert_eq!(field, vec!["name"]);
70 }
71
72 #[test]
73 fn test_parse_query_segments_with_array_index() {
74 let result = parse_query_segments(".users[0].name");
76 assert!(result.is_ok());
77 let (segment, field) = result.unwrap();
78 assert_eq!(segment, "users[0]");
79 assert_eq!(field, vec!["name"]);
80 }
81
82 #[test]
83 fn test_parse_query_segments_different_fields() {
84 let result = parse_query_segments(".products.price");
86 assert!(result.is_ok());
87 let (segment, field) = result.unwrap();
88 assert_eq!(segment, "products");
89 assert_eq!(field, vec!["price"]);
90 }
91
92 #[test]
93 fn test_parse_query_segments_complex_index() {
94 let result = parse_query_segments(".items[123].description");
96 assert!(result.is_ok());
97 let (segment, field) = result.unwrap();
98 assert_eq!(segment, "items[123]");
99 assert_eq!(field, vec!["description"]);
100 }
101
102 #[test]
103 fn test_parse_query_segments_missing_field_segment() {
104 let result = parse_query_segments(".");
106 assert!(result.is_err());
107 match result.unwrap_err() {
108 Error::InvalidQuery(msg) => {
109 assert!(msg.contains("Missing parameter segment"));
110 }
111 _ => panic!("Expected InvalidQuery error"),
112 }
113 }
114
115 #[test]
116 fn test_parse_query_segments_truly_missing_field() {
117 let result = parse_query_segments("");
119 assert!(result.is_err());
120 match result.unwrap_err() {
121 Error::InvalidQuery(msg) => {
122 assert!(msg.contains("Missing field segment"));
123 }
124 _ => panic!("Expected InvalidQuery error"),
125 }
126 }
127
128 #[test]
129 fn test_parse_query_segments_missing_parameter_segment() {
130 let result = parse_query_segments(".users");
132 assert!(result.is_err());
133 match result.unwrap_err() {
134 Error::InvalidQuery(msg) => {
135 assert!(msg.contains("Missing parameter segment"));
136 }
137 _ => panic!("Expected InvalidQuery error"),
138 }
139 }
140
141 #[test]
142 fn test_parse_query_segments_empty_query() {
143 let result = parse_query_segments("");
145 assert!(result.is_err());
146 match result.unwrap_err() {
147 Error::InvalidQuery(msg) => {
148 assert!(msg.contains("Missing field segment"));
149 }
150 _ => panic!("Expected InvalidQuery error"),
151 }
152 }
153
154 #[test]
155 fn test_parse_query_segments_no_leading_dot() {
156 let result = parse_query_segments("users.name");
158 assert!(result.is_err());
159 match result.unwrap_err() {
160 Error::InvalidQuery(msg) => {
161 assert!(msg.contains("Missing parameter segment"));
162 }
163 _ => panic!("Expected InvalidQuery error"),
164 }
165 }
166
167 #[test]
168 fn test_parse_query_segments_multiple_segments() {
169 let result = parse_query_segments(".users.name.extra");
171 assert!(result.is_ok());
172 let (segment, fields) = result.unwrap();
173 assert_eq!(segment, "users");
174 assert_eq!(fields, vec!["name", "extra"]); }
176
177 #[test]
178 fn test_parse_query_segments_many_segments() {
179 let result = parse_query_segments(".a.b.c.d.e");
181 assert!(result.is_ok());
182 let (segment, fields) = result.unwrap();
183 assert_eq!(segment, "a");
184 assert_eq!(fields, vec!["b", "c", "d", "e"]);
185 }
186
187 #[test]
188 fn test_parse_array_segment_normal_case() {
189 let result = parse_array_segment("users[0]");
191 assert!(result.is_ok());
192 let (idx, ridx) = result.unwrap();
193 assert_eq!(idx, 5); assert_eq!(ridx, 7); }
196
197 #[test]
198 fn test_parse_array_segment_large_index() {
199 let result = parse_array_segment("items[123]");
201 assert!(result.is_ok());
202 let (idx, ridx) = result.unwrap();
203 assert_eq!(idx, 5); assert_eq!(ridx, 9); }
206
207 #[test]
208 fn test_parse_array_segment_short_name() {
209 let result = parse_array_segment("a[5]");
211 assert!(result.is_ok());
212 let (idx, ridx) = result.unwrap();
213 assert_eq!(idx, 1); assert_eq!(ridx, 3); }
216
217 #[test]
218 fn test_parse_array_segment_missing_open_bracket() {
219 let result = parse_array_segment("users0]");
221 assert!(result.is_err());
222 match result.unwrap_err() {
223 Error::InvalidQuery(msg) => {
224 assert!(msg.contains("Missing '[' in segment"));
225 }
226 _ => panic!("Expected InvalidQuery error"),
227 }
228 }
229
230 #[test]
231 fn test_parse_array_segment_missing_close_bracket() {
232 let result = parse_array_segment("users[0");
234 assert!(result.is_err());
235 match result.unwrap_err() {
236 Error::InvalidQuery(msg) => {
237 assert!(msg.contains("Missing ']' in segment"));
238 }
239 _ => panic!("Expected InvalidQuery error"),
240 }
241 }
242
243 #[test]
244 fn test_parse_array_segment_invalid_bracket_order() {
245 let result = parse_array_segment("users]0[");
247 assert!(result.is_err());
248 match result.unwrap_err() {
249 Error::InvalidQuery(msg) => {
250 assert!(msg.contains("Invalid bracket order"));
251 }
252 _ => panic!("Expected InvalidQuery error"),
253 }
254 }
255
256 #[test]
257 fn test_parse_array_segment_empty_brackets() {
258 let result = parse_array_segment("users[]");
260 assert!(result.is_ok()); let (idx, ridx) = result.unwrap();
262 assert_eq!(idx, 5); assert_eq!(ridx, 6); }
265
266 #[test]
267 fn test_parse_array_segment_no_brackets() {
268 let result = parse_array_segment("users");
270 assert!(result.is_err());
271 match result.unwrap_err() {
272 Error::InvalidQuery(msg) => {
273 assert!(msg.contains("Missing '[' in segment"));
274 }
275 _ => panic!("Expected InvalidQuery error"),
276 }
277 }
278}