drop_down_auto_complete/
drop_down_auto_complete.rs1use lineeditor::event::LineEditorEvent;
2use lineeditor::keybindings::KeyCombination;
3use lineeditor::styled_buffer::StyledBuffer;
4use lineeditor::Completer;
5use lineeditor::KeyModifiers;
6use lineeditor::LineEditor;
7use lineeditor::LineEditorResult;
8use lineeditor::Span;
9use lineeditor::StringPrompt;
10use lineeditor::Suggestion;
11
12const GITQL_RESERVED_KEYWORDS: [&str; 31] = [
13 "set", "select", "distinct", "from", "group", "where", "having", "offset", "limit", "order",
14 "by", "case", "when", "then", "else", "end", "between", "in", "is", "not", "like", "glob",
15 "or", "and", "xor", "true", "false", "null", "as", "asc", "desc",
16];
17
18pub struct FixedCompleter {}
19
20impl Completer for FixedCompleter {
21 fn complete(&self, input: &StyledBuffer) -> Vec<Suggestion> {
22 let mut suggestions: Vec<Suggestion> = vec![];
23 if input.position() != input.len() {
24 return suggestions;
25 }
26
27 if let Some(keyword) = input.last_alphabetic_keyword() {
28 for reserved_keyword in GITQL_RESERVED_KEYWORDS {
29 if reserved_keyword.starts_with(&keyword) {
30 let suggestion = Suggestion {
31 content: StyledBuffer::from(reserved_keyword),
32 span: Span {
33 start: input.len() - keyword.len(),
34 end: input.len(),
35 },
36 };
37 suggestions.push(suggestion);
38 }
39 }
40 }
41 suggestions
42 }
43}
44
45fn main() {
46 let prompt = StringPrompt::new("prompt> ".to_string());
47 let mut line_editor = LineEditor::new(Box::new(prompt));
48
49 line_editor.set_completer(Box::new(FixedCompleter {}));
50
51 let bindings = line_editor.keybinding();
52
53 bindings.register_binding(
54 KeyCombination {
55 key_kind: lineeditor::KeyEventKind::Press,
56 modifier: KeyModifiers::NONE,
57 key_code: lineeditor::KeyCode::Tab,
58 },
59 LineEditorEvent::ToggleAutoComplete,
60 );
61 bindings.register_common_control_bindings();
62 bindings.register_common_navigation_bindings();
63 bindings.register_common_edit_bindings();
64 bindings.register_common_selection_bindings();
65
66 match line_editor.read_line() {
67 Ok(LineEditorResult::Success(line)) => {
68 println!("Line {}", line);
69 }
70 _ => {}
71 }
72}