keyword_hinter/
keyword_hinter.rs1use 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}