keyword_hinter/
keyword_hinter.rs

1use lineeditor::style::Style;
2use lineeditor::styled_buffer::StyledBuffer;
3use lineeditor::Color;
4use lineeditor::Hinter;
5use lineeditor::LineEditor;
6use lineeditor::LineEditorResult;
7use lineeditor::StringPrompt;
8
9const GITQL_RESERVED_KEYWORDS: [&str; 31] = [
10    "set", "select", "distinct", "from", "group", "where", "having", "offset", "limit", "order",
11    "by", "case", "when", "then", "else", "end", "between", "in", "is", "not", "like", "glob",
12    "or", "and", "xor", "true", "false", "null", "as", "asc", "desc",
13];
14
15#[derive(Default)]
16pub struct GitQLHinter {}
17
18impl Hinter for GitQLHinter {
19    fn hint(&self, buffer: &mut StyledBuffer) -> Option<StyledBuffer> {
20        if let Some(keyword) = buffer.last_alphabetic_keyword() {
21            let keyword_lower = keyword.to_lowercase();
22            for word in GITQL_RESERVED_KEYWORDS {
23                if word.starts_with(&keyword_lower) {
24                    let hint = &word[keyword.len()..];
25                    let mut styled_buffer = StyledBuffer::default();
26                    let mut style = Style::default();
27                    style.set_foreground_color(Color::DarkGrey);
28                    styled_buffer.insert_styled_string(hint, style);
29                    return Some(styled_buffer);
30                }
31            }
32        }
33        None
34    }
35}
36
37fn main() {
38    let prompt = StringPrompt::new("prompt> ".to_string());
39    let mut line_editor = LineEditor::new(Box::new(prompt));
40    line_editor.add_hinter(Box::<GitQLHinter>::default());
41
42    let bindings = line_editor.keybinding();
43    bindings.register_common_control_bindings();
44
45    match line_editor.read_line() {
46        Ok(LineEditorResult::Success(line)) => {
47            println!("Line {}", line);
48        }
49        _ => {}
50    }
51}