1pub 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}