Skip to content
Snippets Groups Projects
example.rs 2.6 KiB
Newer Older
gwenn's avatar
gwenn committed
extern crate log;
extern crate rustyline;

use std::cell::RefCell;
gwenn's avatar
gwenn committed
use std::io::{self, Write};
use std::rc::Rc;
gwenn's avatar
gwenn committed
use log::{LogLevel, LogLevelFilter, LogMetadata, LogRecord, SetLoggerError};
gwenn's avatar
gwenn committed

use rustyline::completion::FilenameCompleter;
gwenn's avatar
gwenn committed
use rustyline::hint::Hinter;
use rustyline::error::ReadlineError;
gwenn's avatar
gwenn committed
use rustyline::{Cmd, CompletionType, Config, EditMode, Editor, KeyPress};
// On unix platforms you can use ANSI escape sequences
#[cfg(unix)]
static PROMPT: &'static str = "\x1b[1;32m>>\x1b[0m ";

// Windows consoles typically don't support ANSI escape sequences out
// of the box
#[cfg(windows)]
static PROMPT: &'static str = ">> ";

gwenn's avatar
gwenn committed
struct Hints {}

impl Hinter for Hints {
    fn hint(&mut self, line: &str, _pos: usize) -> Option<String> {
        if line == "hello" {
            Some(" \x1b[1mWorld\x1b[m".to_owned())
        } else {
            None
        }
    }
}

gwenn's avatar
gwenn committed
    init_logger().is_ok();
gwenn's avatar
gwenn committed
    let config = Config::builder()
        .history_ignore_space(true)
gwenn's avatar
gwenn committed
        .completion_type(CompletionType::List)
gwenn's avatar
gwenn committed
        .edit_mode(EditMode::Emacs)
gwenn's avatar
gwenn committed
        .build();
    let c = FilenameCompleter::new();
    let mut rl = Editor::with_config(config);
    rl.set_completer(Some(Rc::new(RefCell::new(c))));
gwenn's avatar
gwenn committed
    rl.set_hinter(Some(Rc::new(RefCell::new(Hints {}))));
    rl.bind_sequence(KeyPress::Meta('N'), Cmd::HistorySearchForward);
    rl.bind_sequence(KeyPress::Meta('P'), Cmd::HistorySearchBackward);
gwenn's avatar
gwenn committed
    if rl.load_history("history.txt").is_err() {
        println!("No previous history.");
    }
    loop {
        let readline = rl.readline(PROMPT);
gwenn's avatar
gwenn committed
                rl.add_history_entry(line.as_ref());
gwenn's avatar
gwenn committed
            }
            Err(ReadlineError::Interrupted) => {
                println!("CTRL-C");
gwenn's avatar
gwenn committed
                break;
            }
            Err(ReadlineError::Eof) => {
                println!("CTRL-D");
gwenn's avatar
gwenn committed
                break;
            }
            Err(err) => {
                println!("Error: {:?}", err);
gwenn's avatar
gwenn committed
                break;
    rl.save_history("history.txt").unwrap();
gwenn's avatar
gwenn committed

struct Logger;

impl log::Log for Logger {
    fn enabled(&self, metadata: &LogMetadata) -> bool {
        metadata.level() <= LogLevel::Debug
    }

    fn log(&self, record: &LogRecord) {
        if self.enabled(record.metadata()) {
            writeln!(io::stderr(), "{} - {}", record.level(), record.args()).unwrap();
        }
    }
}

fn init_logger() -> Result<(), SetLoggerError> {
    log::set_logger(|max_log_level| {
gwenn's avatar
gwenn committed
        max_log_level.set(LogLevelFilter::Info);
        Box::new(Logger)
    })
gwenn's avatar
gwenn committed
}