Files
zesdex/src/controller/command.rs
T

60 lines
2.2 KiB
Rust
Raw Normal View History

use crate::app::mode::ModeKind;
#[derive(Debug, Clone, PartialEq)]
pub enum Command {
Help,
Quit,
Resume,
LessonCreate(String),
LessonExport(String),
LessonImport(String),
LessonAccept(String),
LessonReject(String),
Mode(ModeKind),
Clear,
Save,
LessonList,
Login { provider: String },
Unknown(String),
}
pub fn parse_command(text: &str) -> Command {
let text = text.trim();
if !text.starts_with('/') {
return Command::Unknown(text.to_string());
}
let parts: Vec<&str> = text.splitn(3, ' ').collect();
let cmd = parts[0];
let arg1 = parts.get(1).copied().unwrap_or("");
let arg2 = parts.get(2).copied().unwrap_or("");
match cmd {
"/help" => Command::Help,
"/quit" => Command::Quit,
"/resume" => Command::Resume,
"/clear" => Command::Clear,
"/save" => Command::Save,
"/mode" => {
let mode = match arg1 {
"chat" | "c" => ModeKind::Chat,
"agents" | "a" => ModeKind::Agents,
"bash" | "b" => ModeKind::Bash,
"workflow" | "w" => ModeKind::Workflow,
"help" | "h" => ModeKind::Help,
"settings" | "s" => ModeKind::Settings,
_ => return Command::Unknown(format!("unknown mode: {}", arg1)),
};
Command::Mode(mode)
}
"/lesson" if arg1 == "export" && !arg2.is_empty() => Command::LessonExport(arg2.to_string()),
"/lesson" if arg1 == "import" && !arg2.is_empty() => Command::LessonImport(arg2.to_string()),
"/lesson" if arg1 == "list" || arg1 == "ls" => Command::LessonList,
"/lesson" if arg1 == "accept" && !arg2.is_empty() => Command::LessonAccept(arg2.to_string()),
"/lesson" if arg1 == "reject" && !arg2.is_empty() => Command::LessonReject(arg2.to_string()),
"/lesson" if !arg1.is_empty() => Command::LessonCreate(arg1.to_string()),
"/lesson" => Command::LessonList,
"/login" if !arg1.is_empty() => Command::Login { provider: arg1.to_string() },
"/login" => Command::Login { provider: "zen".to_string() },
_ => Command::Unknown(cmd.to_string()),
}
}