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![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    
38    // println!("Normal parse result: {:?}", result);
39    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        // 正常ケース: 基本的なクエリ
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_truly_missing_field() {
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 field segment"));
110            }
111            _ => panic!("Expected InvalidQuery error"),
112        }
113    }
114
115
116    #[test]
117    fn test_parse_query_segments_empty_query() {
118        // エラーケース: 空のクエリ
119        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        // 正常ケース: 基本的な配列インデックス
132        let result = parse_array_segment("users[0]");
133        assert!(result.is_ok());
134        let (idx, ridx) = result.unwrap();
135        assert_eq!(idx, 5); // '[' の位置
136        assert_eq!(ridx, 7); // ']' の位置
137    }
138
139    #[test]
140    fn test_parse_array_segment_large_index() {
141        // 正常ケース: 大きなインデックス
142        let result = parse_array_segment("items[123]");
143        assert!(result.is_ok());
144        let (idx, ridx) = result.unwrap();
145        assert_eq!(idx, 5); // '[' の位置
146        assert_eq!(ridx, 9); // ']' の位置
147    }
148
149    #[test]
150    fn test_parse_array_segment_short_name() {
151        // 正常ケース: 短いフィールド名
152        let result = parse_array_segment("a[5]");
153        assert!(result.is_ok());
154        let (idx, ridx) = result.unwrap();
155        assert_eq!(idx, 1); // '[' の位置
156        assert_eq!(ridx, 3); // ']' の位置
157    }
158
159    #[test]
160    fn test_parse_array_segment_missing_open_bracket() {
161        // エラーケース: '[' がない
162        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        // エラーケース: ']' がない
175        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        // エラーケース: ブラケットの順序が逆
188        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        // エラーケース: 空のブラケット
201        let result = parse_array_segment("users[]");
202        assert!(result.is_ok()); // パース自体は成功する
203        let (idx, ridx) = result.unwrap();
204        assert_eq!(idx, 5); // '[' の位置
205        assert_eq!(ridx, 6); // ']' の位置
206    }
207
208    #[test]
209    fn test_parse_array_segment_no_brackets() {
210        // エラーケース: ブラケットが全くない
211        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}