Skip to main content

sift_core/search/
matcher.rs

1use grep_matcher::LineTerminator;
2use grep_regex::{RegexMatcher, RegexMatcherBuilder};
3use grep_searcher::{BinaryDetection, Searcher, SearcherBuilder};
4
5use super::CompiledSearch;
6
7impl CompiledSearch {
8    /// # Errors
9    /// Returns an error if pattern compilation fails.
10    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}