lineeditor 0.4.1

A cross platform rich line editor
Documentation
use lineeditor::style::Style;
use lineeditor::styled_buffer::StyledBuffer;
use lineeditor::Color;
use lineeditor::Hinter;
use lineeditor::LineEditor;
use lineeditor::LineEditorResult;
use lineeditor::StringPrompt;

const GITQL_RESERVED_KEYWORDS: [&str; 31] = [
    "set", "select", "distinct", "from", "group", "where", "having", "offset", "limit", "order",
    "by", "case", "when", "then", "else", "end", "between", "in", "is", "not", "like", "glob",
    "or", "and", "xor", "true", "false", "null", "as", "asc", "desc",
];

#[derive(Default)]
pub struct GitQLHinter {}

impl Hinter for GitQLHinter {
    fn hint(&self, buffer: &mut StyledBuffer) -> Option<StyledBuffer> {
        if let Some(keyword) = buffer.last_alphabetic_keyword() {
            let keyword_lower = keyword.to_lowercase();
            for word in GITQL_RESERVED_KEYWORDS {
                if word.starts_with(&keyword_lower) {
                    let hint = &word[keyword.len()..];
                    let mut styled_buffer = StyledBuffer::default();
                    let mut style = Style::default();
                    style.set_foreground_color(Color::DarkGrey);
                    styled_buffer.insert_styled_string(hint, style);
                    return Some(styled_buffer);
                }
            }
        }
        None
    }
}

fn main() {
    let prompt = StringPrompt::new("prompt> ".to_string());
    let mut line_editor = LineEditor::new(Box::new(prompt));
    line_editor.add_hinter(Box::<GitQLHinter>::default());

    let bindings = line_editor.keybinding();
    bindings.register_common_control_bindings();

    match line_editor.read_line() {
        Ok(LineEditorResult::Success(line)) => {
            println!("Line {}", line);
        }
        _ => {}
    }
}