search.rs

 1use bitflags::bitflags;
 2pub use buffer_search::BufferSearchBar;
 3use gpui::{actions, Action, AppContext};
 4use project::search::SearchQuery;
 5pub use project_search::{ProjectSearchBar, ProjectSearchView};
 6
 7pub mod buffer_search;
 8pub mod project_search;
 9
10pub fn init(cx: &mut AppContext) {
11    buffer_search::init(cx);
12    project_search::init(cx);
13}
14
15actions!(
16    search,
17    [
18        ToggleWholeWord,
19        ToggleCaseSensitive,
20        ToggleRegex,
21        SelectNextMatch,
22        SelectPrevMatch
23    ]
24);
25
26bitflags! {
27    #[derive(Default)]
28    pub struct SearchOptions: u8 {
29        const NONE = 0b000;
30        const WHOLE_WORD = 0b001;
31        const CASE_SENSITIVE = 0b010;
32        const REGEX = 0b100;
33    }
34}
35
36impl SearchOptions {
37    pub fn label(&self) -> &'static str {
38        match *self {
39            SearchOptions::WHOLE_WORD => "Match Whole Word",
40            SearchOptions::CASE_SENSITIVE => "Match Case",
41            SearchOptions::REGEX => "Use Regular Expression",
42            _ => panic!("{:?} is not a named SearchOption", self),
43        }
44    }
45
46    pub fn to_toggle_action(&self) -> Box<dyn Action> {
47        match *self {
48            SearchOptions::WHOLE_WORD => Box::new(ToggleWholeWord),
49            SearchOptions::CASE_SENSITIVE => Box::new(ToggleCaseSensitive),
50            SearchOptions::REGEX => Box::new(ToggleRegex),
51            _ => panic!("{:?} is not a named SearchOption", self),
52        }
53    }
54
55    pub fn from_query(query: &SearchQuery) -> SearchOptions {
56        let mut options = SearchOptions::NONE;
57        options.set(SearchOptions::WHOLE_WORD, query.whole_word());
58        options.set(SearchOptions::CASE_SENSITIVE, query.case_sensitive());
59        options.set(SearchOptions::REGEX, query.is_regex());
60        options
61    }
62}