hawk_data/
parser.rs

1use crate::Error;
2
3pub fn parse_query_segments(query: &str) -> Result<(&str, Vec<&str>), Error> {
4    // println!("=== parse_query_segments Debug ===");
5    // println!("Input query: '{}'", query);
6
7    if query == "." {
8        return Ok(("", vec![]));
9    }
10
11    // パイプライン操作がある場合は基本クエリ部分のみを処理
12    let base_query = if query.contains('|') {
13        query.split('|').next().unwrap().trim()
14    } else {
15        query
16    };
17
18    // println!("Base query: '{}'", base_query);
19
20    // ".[0]" のような場合の特別扱い
21    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        // println!("Root array access result: {:?}", result);
28        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    // println!("Normal parse result: {:?}", result);
39    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        // 正常ケース: 基本的なクエリ
65        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        // 正常ケース: 配列インデックス付き
75        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        // 正常ケース: 異なるフィールド名
85        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        // 正常ケース: 大きなインデックス
95        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        // エラーケース: フィールドセグメントが不足
105        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        // エラーケース: 本当にフィールドセグメントが不足
118        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        // エラーケース: パラメータセグメントが不足
131        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        // エラーケース: 空のクエリ
144        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        // エラーケース: 先頭の.がない
157        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        // 修正: 複数セグメントは正常に処理される
170        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"]); // 3番目も含まれる
175    }
176
177    #[test]
178    fn test_parse_query_segments_many_segments() {
179        // さらに多くのセグメント
180        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        // 正常ケース: 基本的な配列インデックス
190        let result = parse_array_segment("users[0]");
191        assert!(result.is_ok());
192        let (idx, ridx) = result.unwrap();
193        assert_eq!(idx, 5); // '[' の位置
194        assert_eq!(ridx, 7); // ']' の位置
195    }
196
197    #[test]
198    fn test_parse_array_segment_large_index() {
199        // 正常ケース: 大きなインデックス
200        let result = parse_array_segment("items[123]");
201        assert!(result.is_ok());
202        let (idx, ridx) = result.unwrap();
203        assert_eq!(idx, 5); // '[' の位置
204        assert_eq!(ridx, 9); // ']' の位置
205    }
206
207    #[test]
208    fn test_parse_array_segment_short_name() {
209        // 正常ケース: 短いフィールド名
210        let result = parse_array_segment("a[5]");
211        assert!(result.is_ok());
212        let (idx, ridx) = result.unwrap();
213        assert_eq!(idx, 1); // '[' の位置
214        assert_eq!(ridx, 3); // ']' の位置
215    }
216
217    #[test]
218    fn test_parse_array_segment_missing_open_bracket() {
219        // エラーケース: '[' がない
220        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        // エラーケース: ']' がない
233        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        // エラーケース: ブラケットの順序が逆
246        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        // エラーケース: 空のブラケット
259        let result = parse_array_segment("users[]");
260        assert!(result.is_ok()); // パース自体は成功する
261        let (idx, ridx) = result.unwrap();
262        assert_eq!(idx, 5); // '[' の位置
263        assert_eq!(ridx, 6); // ']' の位置
264    }
265
266    #[test]
267    fn test_parse_array_segment_no_brackets() {
268        // エラーケース: ブラケットが全くない
269        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}