drop_down_auto_complete/
drop_down_auto_complete.rs

1use 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}