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![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
38 Ok((segment, fields))
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_truly_missing_field() {
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 field segment"));
110 }
111 _ => panic!("Expected InvalidQuery error"),
112 }
113 }
114
115
116 #[test]
117 fn test_parse_query_segments_empty_query() {
118 let result = parse_query_segments("");
120 assert!(result.is_err());
121 match result.unwrap_err() {
122 Error::InvalidQuery(msg) => {
123 assert!(msg.contains("Missing field segment"));
124 }
125 _ => panic!("Expected InvalidQuery error"),
126 }
127 }
128
129 #[test]
130 fn test_parse_array_segment_normal_case() {
131 let result = parse_array_segment("users[0]");
133 assert!(result.is_ok());
134 let (idx, ridx) = result.unwrap();
135 assert_eq!(idx, 5); assert_eq!(ridx, 7); }
138
139 #[test]
140 fn test_parse_array_segment_large_index() {
141 let result = parse_array_segment("items[123]");
143 assert!(result.is_ok());
144 let (idx, ridx) = result.unwrap();
145 assert_eq!(idx, 5); assert_eq!(ridx, 9); }
148
149 #[test]
150 fn test_parse_array_segment_short_name() {
151 let result = parse_array_segment("a[5]");
153 assert!(result.is_ok());
154 let (idx, ridx) = result.unwrap();
155 assert_eq!(idx, 1); assert_eq!(ridx, 3); }
158
159 #[test]
160 fn test_parse_array_segment_missing_open_bracket() {
161 let result = parse_array_segment("users0]");
163 assert!(result.is_err());
164 match result.unwrap_err() {
165 Error::InvalidQuery(msg) => {
166 assert!(msg.contains("Missing '[' in segment"));
167 }
168 _ => panic!("Expected InvalidQuery error"),
169 }
170 }
171
172 #[test]
173 fn test_parse_array_segment_missing_close_bracket() {
174 let result = parse_array_segment("users[0");
176 assert!(result.is_err());
177 match result.unwrap_err() {
178 Error::InvalidQuery(msg) => {
179 assert!(msg.contains("Missing ']' in segment"));
180 }
181 _ => panic!("Expected InvalidQuery error"),
182 }
183 }
184
185 #[test]
186 fn test_parse_array_segment_invalid_bracket_order() {
187 let result = parse_array_segment("users]0[");
189 assert!(result.is_err());
190 match result.unwrap_err() {
191 Error::InvalidQuery(msg) => {
192 assert!(msg.contains("Invalid bracket order"));
193 }
194 _ => panic!("Expected InvalidQuery error"),
195 }
196 }
197
198 #[test]
199 fn test_parse_array_segment_empty_brackets() {
200 let result = parse_array_segment("users[]");
202 assert!(result.is_ok()); let (idx, ridx) = result.unwrap();
204 assert_eq!(idx, 5); assert_eq!(ridx, 6); }
207
208 #[test]
209 fn test_parse_array_segment_no_brackets() {
210 let result = parse_array_segment("users");
212 assert!(result.is_err());
213 match result.unwrap_err() {
214 Error::InvalidQuery(msg) => {
215 assert!(msg.contains("Missing '[' in segment"));
216 }
217 _ => panic!("Expected InvalidQuery error"),
218 }
219 }
220}