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}