76 lines
2.3 KiB
Rust
76 lines
2.3 KiB
Rust
use crate::enums::Address;
|
|
use std::io;
|
|
|
|
pub struct Buffer {
|
|
has_changed: bool,
|
|
buffer: Vec<Result<String, io::Error>>,
|
|
current_line: usize,
|
|
}
|
|
|
|
impl Buffer {
|
|
pub fn new(buffer: Vec<Result<String, io::Error>>) -> Self {
|
|
let tmp = buffer.len().saturating_sub(1);
|
|
Self {
|
|
has_changed: false,
|
|
buffer,
|
|
current_line: tmp
|
|
}
|
|
}
|
|
|
|
// Return the actual line of the buffer
|
|
pub fn line(&self) -> usize {
|
|
self.current_line
|
|
}
|
|
|
|
// change la ligne actuelle
|
|
pub fn change_line(&mut self, new: usize) {
|
|
// TODO check si > len
|
|
self.current_line = new;
|
|
}
|
|
|
|
pub fn print(&mut self, addr: Address, print_numbers: bool) {
|
|
let last_line = self.buffer.len().saturating_sub(1);
|
|
match addr {
|
|
Address::Actual => self.print_line(self.current_line, print_numbers),
|
|
Address::Line(l) => self.print_line(l.saturating_sub(1), print_numbers),
|
|
Address::Last => self.print_line(last_line, print_numbers),
|
|
Address::All => self.print_range(0, last_line, print_numbers),
|
|
Address::FromTo(a, b) => self.print_range(a, b, print_numbers),
|
|
Address::FromStartTo(a) => self.print_range(0, a, print_numbers),
|
|
Address::FromToEnd(a) => self.print_range(a, last_line, print_numbers),
|
|
Address::Null => println!("nul !"),
|
|
_ => println!("coucou2"),
|
|
}
|
|
}
|
|
|
|
// affiche une ligne
|
|
fn print_line(&mut self, nb: usize, print_numbers: bool) {
|
|
if nb >= self.buffer.len() {
|
|
println!("?");
|
|
} else if let Ok(line) = &self.buffer[nb] {
|
|
self.current_line = nb;
|
|
|
|
if print_numbers {
|
|
println!("{}\t{}", nb + 1, line);
|
|
} else {
|
|
println!("{}", line);
|
|
}
|
|
} else {
|
|
println!("?");
|
|
}
|
|
}
|
|
|
|
// affiche plusieurs lignes
|
|
fn print_range(&mut self, first: usize, last: usize, print_numbers: bool) {
|
|
let len = self.buffer.len();
|
|
// anti idiot, vraiment utile vu que les adresses gères déjà ça ?
|
|
if len > 0 && (first <= len && last <= len && first <= last) {
|
|
for i in first..last {
|
|
self.print_line(i, print_numbers);
|
|
}
|
|
} else {
|
|
println!("?");
|
|
}
|
|
}
|
|
}
|