fff_query_parser/constraints.rs
1/// Constraint types that can be extracted from a query
2#[derive(Debug, Clone, PartialEq, Eq)]
3pub enum Constraint<'a> {
4 /// Match file extension: *.rs -> Extension("rs")
5 Extension(&'a str),
6
7 /// Glob pattern: **/*.rs -> Glob("**/*.rs")
8 Glob(&'a str),
9
10 /// Multiple text search parts: ["src", "name"]
11 /// Uses slice to avoid allocation
12 Parts(&'a [&'a str]),
13
14 /// Single text token (optimized case)
15 Text(&'a str),
16
17 /// Exclude pattern: !test -> Exclude(&["test"])
18 Exclude(&'a [&'a str]),
19
20 /// Path constraint: /src/ -> PathSegment("src")
21 PathSegment(&'a str),
22
23 /// File path constraint (AI mode): "libswscale/input.c" → FilePath("libswscale/input.c")
24 /// Matches files whose relative path ends with this suffix at a `/` boundary.
25 FilePath(&'a str),
26
27 /// File type constraint: type:rust -> FileType("rust")
28 FileType(&'a str),
29
30 /// Git status constraint: status:modified -> GitStatus(Modified)
31 GitStatus(GitStatusFilter),
32
33 /// Negation constraint: !extension:rs -> Not(Extension("rs"))
34 /// Negates the inner constraint
35 Not(Box<Constraint<'a>>),
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum GitStatusFilter {
40 Modified,
41 Untracked,
42 Staged,
43 Unmodified,
44}
45
46/// Buffer for text parts during query parsing.
47pub(crate) type TextPartsBuffer<'a> = Vec<&'a str>;