Skip to main content

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>;