pub mod error_consts;
mod cmd;
pub mod ui;
pub mod buffer;
use ui::UI;
use buffer::Buffer;
pub struct Ed <'a, B: Buffer> {
selection: Option<(usize, usize)>,
buffer: &'a mut B,
path: String,
s_args: Option<(String, String, bool)>,
print_errors: bool,
error: Option<&'static str>,
}
impl <'a, B: Buffer> Ed <'a, B> {
pub fn new(
buffer: &'a mut B,
path: String,
) -> Result<Self, &'static str> {
let len = path.len();
if len != 0 {
buffer.read_from(&path, None, false)?;
}
let tmp = Self {
print_errors: true,
error: None,
s_args: None,
selection: None,
buffer: buffer,
path: path,
};
Ok(tmp)
}
pub fn run_command(
&mut self,
ui: &mut dyn UI,
command: &str,
) -> Result<bool, &'static str> {
match cmd::run(self, ui, command) {
Err(e) => {
self.error = Some(e);
Err(e)
},
x => x,
}
}
pub fn run_macro(
&mut self,
ui: &mut dyn UI,
) -> Result<(), &'static str> {
loop {
let cmd = match ui.get_command( self.buffer ) {
Err(e) => { self.error = Some(e); return Err(e) },
Ok(x) => x,
};
if self.run_command(ui, &cmd)? {
break;
}
}
Ok(())
}
pub fn run(
&mut self,
ui: &mut dyn UI,
) -> Result<(), &'static str> {
loop {
match self.run_macro(ui) {
Ok(()) => break,
Err(_) => {
if self.print_errors {
ui.print(self.error.unwrap())?;
}
else {
ui.print("?\n")?;
}
},
}
}
Ok(())
}
}