diff --git a/src/buffer.rs b/src/buffer.rs
index 5cec7f7..1bd77f7 100644
--- a/src/buffer.rs
+++ b/src/buffer.rs
@@ -1,5 +1,5 @@
use crate::enums::Address;
-use std::fs::OpenOptions;
+use std::fs::File;
use std::io;
use std::io::Write;
@@ -36,10 +36,27 @@ impl Buffer {
self.current_line = new;
}
- pub fn save(&mut self) {
- if let Ok(mut file) = OpenOptions::new().write(true).open(&self.file_name) {
+ pub fn save(&mut self, range: Address) {
+ let len = self.buffer.len();
+ let curr = self.current_line.saturating_sub(1);
+ match range {
+ Address::Actual => self.save_range(curr, curr),
+ Address::Empty | Address::All => self.save_range(0, len),
+ Address::Last => self.save_range(len.saturating_sub(1), len),
+ Address::Line(l) => self.save_range(l.saturating_sub(1), l),
+ Address::FromStartTo(l) => self.save_range(0, l),
+ Address::FromToEnd(l) => self.save_range(l.saturating_sub(1), len),
+ Address::FromTo(a, b) => self.save_range(a.saturating_sub(1), b),
+ Address::FromActTo(l) => self.save_range(curr, l),
+ Address::FromActToEnd => self.save_range(curr, len),
+ _ => (),
+ }
+ }
+
+ fn save_range(&mut self, start: usize, end: usize) {
+ if let Ok(mut file) = File::create(&self.file_name) {
let mut tmp = String::new();
- for line in self.buffer.iter().flatten() {
+ for line in self.buffer[start..end].iter().flatten() {
tmp.push_str(line);
tmp.push('\n');
}
diff --git a/src/enums.rs b/src/enums.rs
index 4bd3141..5cb5a68 100644
--- a/src/enums.rs
+++ b/src/enums.rs
@@ -4,6 +4,9 @@ use std::str::FromStr;
#[derive(Debug)]
pub enum Address {
Actual,
+ // utile pour write qui considère une adresse nulle comme l'ensemble du
+ // fichier par défaut
+ Empty,
Last,
Line(usize),
FromStartTo(usize),
@@ -19,7 +22,7 @@ impl Address {
pub fn is_multi_line(&self) -> bool {
!matches!(
self,
- Address::Null | Address::Actual | Address::Last | Address::Line(_)
+ Address::Null | Address::Actual | Address::Last | Address::Line(_) | Address::Empty
)
}
}
@@ -30,7 +33,7 @@ pub fn parse_address(addr: &str) -> Address {
let addr = tmp.as_str();
if addr.is_empty() {
- Address::Actual
+ Address::Empty
} else if addr.contains(',') || addr.contains(';') {
parse_multi_addr(addr)
} else if let Ok(l) = usize::from_str(addr) {
@@ -120,8 +123,9 @@ pub enum Command {
Substitute,
// TODO
CopyLines,
- Undo,
// TODO
+ Undo,
+ // TODO nom de fichier
Write(Address),
// TODO
Line,
diff --git a/src/main.rs b/src/main.rs
index 443b450..3d6cd2b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -81,8 +81,8 @@ fn execute_command(buffer: &mut Buffer, c: Command) -> Exit {
ret = Exit::Quit;
}
}
- Command::Write(_) => {
- buffer.save();
+ Command::Write(a) => {
+ buffer.save(a);
ret = Exit::Continue;
}
_ => (),