sift_core/search/
matcher.rs1use grep_matcher::LineTerminator;
2use grep_regex::{RegexMatcher, RegexMatcherBuilder};
3use grep_searcher::{BinaryDetection, Searcher, SearcherBuilder};
4
5use super::CompiledSearch;
6
7impl CompiledSearch {
8 pub fn build_matcher(&self) -> crate::Result<RegexMatcher> {
11 let mut builder = RegexMatcherBuilder::new();
12 builder
13 .multi_line(true)
14 .case_insensitive(self.opts.case_insensitive());
15 builder.fixed_strings(self.opts.fixed_strings());
16 if self.opts.word_regexp() {
17 builder.word(true);
18 }
19 if self.opts.line_regexp() {
20 builder.whole_line(true);
21 }
22 builder.line_terminator(Some(b'\n'));
23 builder.ban_byte(Some(b'\x00'));
24 builder
25 .build_many(&self.patterns)
26 .map_err(|e| crate::Error::RegexBuild(e.to_string()))
27 }
28
29 pub(super) fn build_searcher(&self, line_number: bool, max_matches: Option<usize>) -> Searcher {
30 let mut builder = SearcherBuilder::new();
31 builder
32 .binary_detection(BinaryDetection::quit(b'\x00'))
33 .line_terminator(LineTerminator::byte(b'\n'))
34 .invert_match(self.opts.invert_match())
35 .line_number(line_number)
36 .max_matches(max_matches.map(|n| n as u64));
37 builder.build()
38 }
39}