red/src/enums.rs

197 lines
4.1 KiB
Rust
Raw Normal View History

2023-04-15 23:03:46 +00:00
use std::num::ParseIntError;
2023-04-23 01:31:12 +00:00
use std::str::FromStr;
#[derive(Debug)]
pub enum Address {
Actual,
2023-04-23 09:48:54 +00:00
// utile pour write qui considère une adresse nulle comme l'ensemble du
// fichier par défaut
Empty,
Last,
Line(usize),
FromStartTo(usize),
2023-04-14 12:42:04 +00:00
FromToEnd(usize), // pas sur ?
FromTo(usize, usize),
2023-04-15 23:03:46 +00:00
FromActTo(usize),
FromActToEnd,
2023-04-14 12:42:04 +00:00
All,
Null,
}
2023-04-22 23:11:46 +00:00
impl Address {
pub fn is_multi_line(&self) -> bool {
2023-04-23 01:31:12 +00:00
!matches!(
self,
2023-04-23 09:48:54 +00:00
Address::Null | Address::Actual | Address::Last | Address::Line(_) | Address::Empty
2023-04-23 01:31:12 +00:00
)
2023-04-22 23:11:46 +00:00
}
}
pub fn parse_address(addr: &str) -> Address {
let mut tmp = String::from(addr);
tmp.retain(|c| c != ' ');
let addr = tmp.as_str();
if addr.is_empty() {
2023-04-23 09:48:54 +00:00
Address::Empty
2023-04-15 23:03:46 +00:00
} else if addr.contains(',') || addr.contains(';') {
2023-04-14 12:42:04 +00:00
parse_multi_addr(addr)
} else if let Ok(l) = usize::from_str(addr) {
Address::Line(l)
} else {
match addr {
"." => Address::Actual,
"$" => Address::Last,
_ => Address::Null,
}
}
}
2023-04-14 12:42:04 +00:00
fn parse_multi_addr(addr: &str) -> Address {
// garde con ou pas ?
2023-04-15 23:03:46 +00:00
let is_comma = addr.contains(',');
let tmp: Vec<&str> = if is_comma {
2023-04-23 01:31:12 +00:00
addr.split(',').collect()
2023-04-15 23:03:46 +00:00
} else {
2023-04-23 01:31:12 +00:00
addr.split(';').collect()
2023-04-15 23:03:46 +00:00
};
2023-04-14 12:42:04 +00:00
if tmp.len() != 2 {
Address::Null
} else {
let start = usize::from_str(tmp[0]);
let end = usize::from_str(tmp[1]);
if let Ok(a) = start {
if let Ok(b) = end {
Address::FromTo(a, b)
} else {
Address::Line(a)
}
2023-04-15 23:03:46 +00:00
} else if is_comma {
parse_comma(end)
2023-04-14 12:42:04 +00:00
} else {
2023-04-15 23:03:46 +00:00
parse_semicolon(end)
2023-04-14 12:42:04 +00:00
}
}
}
2023-04-15 23:03:46 +00:00
fn parse_comma(end: Result<usize, ParseIntError>) -> Address {
if let Ok(a) = end {
Address::FromStartTo(a)
} else {
Address::All
}
}
fn parse_semicolon(end: Result<usize, ParseIntError>) -> Address {
if let Ok(a) = end {
Address::FromActTo(a)
} else {
Address::FromActToEnd
}
}
#[derive(Debug)]
pub enum Command {
2023-04-23 09:50:56 +00:00
// TODO
Append(Address),
Insert(Address),
2023-04-23 09:50:56 +00:00
// TODO
Change(Address),
2023-04-23 09:50:56 +00:00
// TODO
Delete(Address),
// bool pour check ou pas (e et E) TODO mettre le chemin vers le fichier
Edit(bool),
// TODO chemin vers fichier
File(),
// TODO
Help,
// TODO
SetHelp,
2023-04-23 09:50:56 +00:00
// TODO
Join(Address),
// TODO nom de la marque
Mark(Address),
2023-04-23 09:50:56 +00:00
// TODO
List(Address),
// TODO
Move(Address),
2023-04-23 09:50:56 +00:00
// TODO
Number(Address),
Print(Address),
2023-04-23 09:50:56 +00:00
// TODO
Prompt,
// bool pour check ou pas (q et Q)
Quit(bool),
// TODO
Read,
// TODO
Substitute,
// TODO
CopyLines,
2023-04-23 01:31:12 +00:00
// TODO
2023-04-23 09:48:54 +00:00
Undo,
// TODO nom de fichier
2023-04-23 01:01:37 +00:00
Write(Address),
// TODO
Line,
// TODO
ShellCommand,
// TODO
Null,
// TODO
Global,
// TODO
NonMatched,
}
/*
fn parse_without_addr(c: char) -> Command {
match c {
'q' => Command::Quit(false),
'Q' => Command::Quit(true),
_ => Command::Help,
}
}
*/
2023-04-22 13:12:27 +00:00
fn parse(c: char, addr: Address) -> Result<Command, String> {
match c {
'a' => {
2023-04-22 23:11:46 +00:00
if addr.is_multi_line() {
Err(String::from("Erreur d'adresse"))
2023-04-23 01:31:12 +00:00
} else {
2023-04-22 23:11:46 +00:00
Ok(Command::Append(addr))
}
2023-04-23 01:31:12 +00:00
}
'i' => {
if addr.is_multi_line() {
Err(String::from("Erreur d'adresse"))
} else {
Ok(Command::Insert(addr))
}
}
2023-04-23 17:17:13 +00:00
'd' => Ok(Command::Delete(addr)),
2023-04-22 13:12:27 +00:00
'p' => Ok(Command::Print(addr)),
'n' => Ok(Command::Number(addr)),
'q' => Ok(Command::Quit(false)),
'Q' => Ok(Command::Quit(true)),
2023-04-23 01:01:37 +00:00
'w' => Ok(Command::Write(addr)),
2023-04-22 13:12:27 +00:00
_ => Ok(Command::Help),
}
}
2023-04-22 13:12:27 +00:00
pub fn parse_command(c: char, addr: Address) -> Result<Command, String> {
parse(c, addr)
/*
if let Some(a) = addr {
println!("Ok");
parse_with_addr(c, a)
} else {
println!("No");
parse_without_addr(c)
}
*/
}