Skip to main content

sift_core/search/
mod.rs

1//! Indexed search execution built on the public grep crates.
2
3pub mod candidates;
4pub mod emit;
5pub mod filter;
6pub mod options;
7pub mod output;
8pub mod pattern;
9pub mod query;
10pub mod request;
11pub mod scan;
12
13use thiserror::Error;
14
15use emit::error::ExecutionError;
16use filter::error::FilterError;
17use output::error::OutputError;
18use pattern::error::CompileError;
19
20#[derive(Debug, Error)]
21pub enum SearchError {
22    #[error("search patterns must not be empty")]
23    EmptyPatterns,
24
25    #[error("regex build error: {0}")]
26    RegexBuild(String),
27
28    #[error("invalid max-count: 0 matches requested")]
29    InvalidMaxCount,
30
31    #[error("JSON output is only supported for standard search (not count or file-list modes)")]
32    JsonOutputIncompatibleMode,
33
34    #[error("JSON serialization error: {0}")]
35    JsonSerialize(#[from] serde_json::Error),
36
37    #[error("IO error: {0}")]
38    Io(#[from] std::io::Error),
39
40    #[error("ignore walk error: {0}")]
41    Ignore(#[from] ignore::Error),
42}
43
44impl From<CompileError> for SearchError {
45    fn from(e: CompileError) -> Self {
46        match e {
47            CompileError::RegexBuild(s) => Self::RegexBuild(s),
48        }
49    }
50}
51
52impl From<FilterError> for SearchError {
53    fn from(e: FilterError) -> Self {
54        match e {
55            FilterError::RegexBuild(s) => Self::RegexBuild(s),
56            FilterError::Ignore(e) => Self::Ignore(e),
57        }
58    }
59}
60
61impl From<OutputError> for SearchError {
62    fn from(e: OutputError) -> Self {
63        match e {
64            OutputError::JsonOutputIncompatibleMode => Self::JsonOutputIncompatibleMode,
65            OutputError::JsonSerialize(e) => Self::JsonSerialize(e),
66            OutputError::Io(e) => Self::Io(e),
67        }
68    }
69}
70
71impl From<ExecutionError> for SearchError {
72    fn from(e: ExecutionError) -> Self {
73        match e {
74            ExecutionError::InvalidMaxCount => Self::InvalidMaxCount,
75            ExecutionError::Io(e) => Self::Io(e),
76            ExecutionError::Ignore(e) => Self::Ignore(e),
77        }
78    }
79}
80
81pub use candidates::walk::discover_files;
82pub use emit::stats::SearchStats;
83pub use filter::{
84    CandidateFilter, CandidateFilterConfig, GlobConfig, HiddenMode, IgnoreConfig, IgnoreSources,
85    TypeDef, VisibilityConfig,
86};
87pub use options::{BinaryMode, CaseMode, SearchMatchFlags, SearchOptions};
88pub use output::format::{ColumnLimit, ColumnOverflow};
89pub use output::mode::{MatchEmissionMode, OutputEmission, SearchMode, ZeroCountMode};
90pub use output::passthru::PassthruMode;
91pub use output::style::{
92    ColorChoice, FilenameMode, LineStyleFlags, PathDisplay, RecordTerminator, SearchLineStyle,
93    SearchRecordStyle, SearchSeparators,
94};
95pub use output::{SearchOutput, SearchOutputFormat};
96pub use pattern::PatternCompiler;
97pub use query::Match;
98pub use query::SearchQuery;
99pub use request::{LinkTraversal, WalkOptions};
100
101#[derive(Debug)]
102pub struct SearchOutcome {
103    pub matched: bool,
104    pub stats: Option<SearchStats>,
105}