diff --git a/src/buffer.rs b/src/buffer.rs index 12aae68..949a2cb 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -71,6 +71,30 @@ impl Buffer { } } + pub fn delete(&mut self, addr:Address) { + self.has_changed = true; + let curr = self.current_line; + let last_line = self.buffer.len(); + match addr { + Address::Actual | Address::Empty => self.delete_lines(curr, curr.saturating_add(1)), + Address::Line(l) => self.delete_lines(l.saturating_sub(1), l), + Address::Last => self.delete_lines(last_line.saturating_sub(1), last_line), + Address::All => self.delete_lines(0, last_line), + Address::FromTo(a, b) => self.delete_lines(a.saturating_sub(1), b), + Address::FromStartTo(a) => self.delete_lines(0, a), + Address::FromToEnd(a) => self.delete_lines(a.saturating_sub(1), last_line), + Address::FromActTo(a) => self.delete_lines(curr, a), + Address::FromActToEnd => self.delete_lines(curr, last_line), + Address::Null => println!("nul !"), + } + } + + fn delete_lines(&mut self, start: usize, end: usize) { + for i in start..end { + self.buffer.remove(start); + } + } + pub fn append(&mut self, addr:Address, lines: Vec) { self.has_changed = true; match addr { diff --git a/src/enums.rs b/src/enums.rs index cc54484..48409da 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -172,6 +172,7 @@ fn parse(c: char, addr: Address) -> Result { Ok(Command::Insert(addr)) } } + 'd' => Ok(Command::Delete(addr)), 'p' => Ok(Command::Print(addr)), 'n' => Ok(Command::Number(addr)), 'q' => Ok(Command::Quit(false)), diff --git a/src/main.rs b/src/main.rs index cb8ddec..4b8489e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,6 +71,7 @@ fn execute_command(buffer: &mut Buffer, c: Command) -> Exit { match c { Command::Append(a) => buffer.append(a, read_user_input()), Command::Insert(a) => buffer.insert(a, read_user_input()), + Command::Delete(a) => buffer.delete(a), Command::Print(a) => buffer.print(a, false), Command::Number(a) => buffer.print(a, true), Command::Quit(q) => { @@ -96,7 +97,7 @@ fn execute_command(buffer: &mut Buffer, c: Command) -> Exit { fn parse_line(input: &str) -> Result { let address = take_while(check_address_complete); - let command = one_of::<_, _, (&str, ErrorKind)>("aipnqQw"); + let command = one_of::<_, _, (&str, ErrorKind)>("aidpnqQw"); //if let Ok((input, (a, c))) = alt(address, command).parse(input) { let tmp = (address, command).parse(input);