From db2adaae4c2a2e1032fdb363684fe05534dc78bd Mon Sep 17 00:00:00 2001 From: rick Date: Sun, 23 Apr 2023 03:01:37 +0200 Subject: [PATCH] add write command --- src/buffer.rs | 30 ++++++++++++++++++++++++++++-- src/enums.rs | 3 ++- src/main.rs | 8 ++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 3a552db..3a20102 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -1,22 +1,30 @@ use crate::enums::Address; use std::io; +use std::fs::OpenOptions; +use std::io::Write; pub struct Buffer { has_changed: bool, buffer: Vec>, current_line: usize, + file_name: String, } impl Buffer { - pub fn new(buffer: Vec>) -> Self { + pub fn new(file_name: &str, buffer: Vec>) -> Self { let tmp = buffer.len().saturating_sub(1); Self { has_changed: false, buffer, - current_line: tmp + current_line: tmp, + file_name: String::from(file_name) } } + pub fn is_modified(&self) -> bool { + self.has_changed + } + // Return the actual line of the buffer pub fn line(&self) -> usize { self.current_line @@ -28,6 +36,24 @@ impl Buffer { self.current_line = new; } + pub fn save(&mut self) { + if let Ok(mut file) = OpenOptions::new().write(true).open(&self.file_name) { + let mut tmp = String::new(); + for line in &self.buffer { + if let Ok(l) = line { + tmp.push_str(&l); + tmp.push('\n'); + } + } + + if let Err(e) = file.write(tmp.as_bytes()) { + panic!("{}", e); + } + + self.has_changed = false; + } + } + 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 0238e89..e87abd5 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -122,7 +122,7 @@ pub enum Command { CopyLines, Undo, // TODO - Write, + Write(Address), // TODO Line, // TODO @@ -158,6 +158,7 @@ fn parse(c: char, addr: Address) -> Result { 'n' => Ok(Command::Number(addr)), 'q' => Ok(Command::Quit(false)), 'Q' => Ok(Command::Quit(true)), + 'w' => Ok(Command::Write(addr)), _ => Ok(Command::Help), } } diff --git a/src/main.rs b/src/main.rs index 688c5ca..26989b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -81,6 +81,10 @@ fn execute_command(buffer: &mut Buffer, c: Command) -> Exit { } else { ret = Exit::Quit; }, + Command::Write(_) => { + buffer.save(); + ret = Exit::Continue; + }, _ => (), } @@ -89,7 +93,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)>("apnqQ"); + let command = one_of::<_, _, (&str, ErrorKind)>("apnqQw"); //if let Ok((input, (a, c))) = alt(address, command).parse(input) { let tmp = (address, command).parse(input); @@ -111,7 +115,7 @@ fn main() { panic!("Le fichier n'existe pas."); }; - let mut buffer_struct = Buffer::new(buffer); + let mut buffer_struct = Buffer::new(FILE, buffer); println!("fichier lu !"); let mut pred = Exit::Continue;