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        SelectAllMatches,
24    ]
25);
26
27bitflags! {
28    #[derive(Default)]
29    pub struct SearchOptions: u8 {
30        const NONE = 0b000;
31        const WHOLE_WORD = 0b001;
32        const CASE_SENSITIVE = 0b010;
33        const REGEX = 0b100;
34    }
35}
36
37impl SearchOptions {
38    pub fn label(&self) -> &'static str {
39        match *self {
40            SearchOptions::WHOLE_WORD => "Match Whole Word",
41            SearchOptions::CASE_SENSITIVE => "Match Case",
42            SearchOptions::REGEX => "Use Regular Expression",
43            _ => panic!("{:?} is not a named SearchOption", self),
44        }
45    }
46
47    pub fn to_toggle_action(&self) -> Box<dyn Action> {
48        match *self {
49            SearchOptions::WHOLE_WORD => Box::new(ToggleWholeWord),
50            SearchOptions::CASE_SENSITIVE => Box::new(ToggleCaseSensitive),
51            SearchOptions::REGEX => Box::new(ToggleRegex),
52            _ => panic!("{:?} is not a named SearchOption", self),
53        }
54    }
55
56    pub fn none() -> SearchOptions {
57        SearchOptions::NONE
58    }
59
60    pub fn from_query(query: &SearchQuery) -> SearchOptions {
61        let mut options = SearchOptions::NONE;
62        options.set(SearchOptions::WHOLE_WORD, query.whole_word());
63        options.set(SearchOptions::CASE_SENSITIVE, query.case_sensitive());
64        options.set(SearchOptions::REGEX, query.is_regex());
65        options
66    }
67}