use std::io;
use crate::ansi::{Ansi, Reader};
pub struct Completion(
pub std::ops::Range<usize>,
pub Vec<String>,
);
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
pub enum Event {
Insert(char),
Enter,
Backspace,
Tab,
Left,
Right,
Home,
End,
Interrupt,
Eof,
Suspend,
Abort,
Up,
Down,
Clear,
LeftWord,
RightWord,
}
pub trait Editor {
fn highlight(&self, buffer: &str) -> String {
buffer.to_owned()
}
fn highlight_prompt(&self, prompt: &str, multiline: bool) -> String {
let _ = multiline;
prompt.to_owned()
}
fn hint(&self, buffer: &str) -> Option<String> {
let _ = buffer;
None
}
fn highlight_hint(&self, hint: &str) -> String {
hint.to_owned()
}
fn complete(&self, buffer: &str, cursor: usize) -> Option<Completion> {
let _ = buffer;
let _ = cursor;
None
}
fn indent(&self, buffer: &mut String, cursor: &mut usize) {
buffer.insert_str(*cursor, " ");
*cursor += 2;
}
fn is_multiline(&self, buffer: &str, cursor: usize) -> bool {
let _ = buffer;
let _ = cursor;
false
}
fn is_keyword(c: char) -> bool {
!c.is_ascii() || c.is_ascii_alphanumeric() || c == '_'
}
fn insert(&self, buffer: &mut String, cursor: &mut usize, c: char) {
buffer.insert(*cursor, c);
*cursor += c.len_utf8();
}
fn next_event(&mut self, input: &mut Reader<impl io::Read>) -> io::Result<Event> {
loop {
let event = match input.read_sequence()? {
Ansi::Char(c) => Event::Insert(c),
Ansi::Esc(b'\r') => Event::Insert('\n'),
Ansi::Control(b'M') => Event::Enter,
Ansi::Control(b'?' | b'H') => Event::Backspace,
Ansi::Control(b'I') => Event::Tab,
Ansi::Control(b'B') | Ansi::Csi(b"D") => Event::Left,
Ansi::Control(b'F') | Ansi::Csi(b"C") => Event::Right,
Ansi::Control(b'A') | Ansi::Csi(b"H") => Event::Home,
Ansi::Control(b'E') | Ansi::Csi(b"F") => Event::End,
Ansi::Control(b'C') => Event::Interrupt,
Ansi::Control(b'D') => Event::Eof,
Ansi::Control(b'Z') => Event::Suspend,
Ansi::Control(b'\\') => Event::Abort,
Ansi::Csi(b"A") => Event::Up,
Ansi::Csi(b"B") => Event::Down,
Ansi::Control(b'L') => Event::Clear,
Ansi::Csi(b"1;5D" | b"1;3D") => Event::LeftWord,
Ansi::Csi(b"1;5C" | b"1;3C") => Event::RightWord,
_ => continue,
};
return Ok(event);
}
}
}
pub struct Basic;
impl Editor for Basic {}