use std::path::PathBuf;
#[derive(Debug, Clone)]
pub enum Command {
ChangeDirectory(PathBuf),
Find(String),
Transform(TransformType),
Execute,
ClearQueue,
Quit,
Copy,
SaveQueue(PathBuf),
LoadQueue(PathBuf),
}
#[derive(Debug, Clone, Copy)]
pub enum TransformType {
Snake,
Kebab,
Title,
Camel,
Pascal,
Lower,
Upper,
Clean,
}
pub fn parse_command(command: &str) -> Option<Command> {
let trimmed = command.trim();
let parts: Vec<&str> = trimmed.splitn(2, ' ').collect();
let cmd = parts[0];
let args = parts.get(1).unwrap_or(&"").trim();
match cmd {
"cd" | "chdir" => {
if args.is_empty() {
dirs::home_dir().map(Command::ChangeDirectory)
} else {
Some(Command::ChangeDirectory(PathBuf::from(args)))
}
}
"find" => {
if !args.is_empty() {
Some(Command::Find(args.to_string()))
} else {
None
}
}
"snake" => Some(Command::Transform(TransformType::Snake)),
"kebab" => Some(Command::Transform(TransformType::Kebab)),
"title" => Some(Command::Transform(TransformType::Title)),
"camel" => Some(Command::Transform(TransformType::Camel)),
"pascal" => Some(Command::Transform(TransformType::Pascal)),
"lower" => Some(Command::Transform(TransformType::Lower)),
"upper" => Some(Command::Transform(TransformType::Upper)),
"clean" => Some(Command::Transform(TransformType::Clean)),
"execute" | "exec" => Some(Command::Execute),
"clear" => Some(Command::ClearQueue),
"quit" | "q" => Some(Command::Quit),
"copy" | "cp" => Some(Command::Copy),
"save" => {
if args.is_empty() {
None
} else {
Some(Command::SaveQueue(PathBuf::from(args)))
}
}
"load" => {
if args.is_empty() {
None
} else {
Some(Command::LoadQueue(PathBuf::from(args)))
}
}
_ => None,
}
}