2026-07-11 18:23:01 +07:00
|
|
|
use crate::app::mode::ModeKind;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
|
|
|
pub enum Command {
|
|
|
|
|
Help,
|
|
|
|
|
Quit,
|
|
|
|
|
LessonCreate(String),
|
|
|
|
|
LessonExport(String),
|
|
|
|
|
LessonImport(String),
|
2026-07-11 21:06:22 +07:00
|
|
|
LessonAccept(String),
|
|
|
|
|
LessonReject(String),
|
2026-07-11 22:40:45 +07:00
|
|
|
LessonList,
|
2026-07-11 18:23:01 +07:00
|
|
|
Mode(ModeKind),
|
|
|
|
|
Clear,
|
2026-07-12 02:06:46 +07:00
|
|
|
ClearConfirm,
|
2026-07-11 20:21:59 +07:00
|
|
|
Login { provider: String },
|
2026-07-12 01:25:52 +07:00
|
|
|
Edit(String),
|
|
|
|
|
McpAdd {
|
|
|
|
|
name: String,
|
|
|
|
|
command: String,
|
|
|
|
|
},
|
2026-07-12 02:06:46 +07:00
|
|
|
ModelList,
|
2026-07-11 18:23:01 +07:00
|
|
|
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,
|
2026-07-12 02:06:46 +07:00
|
|
|
"/clear" if arg1.is_empty() => Command::ClearConfirm,
|
2026-07-11 18:23:01 +07:00
|
|
|
"/clear" => Command::Clear,
|
2026-07-12 02:14:40 +07:00
|
|
|
"/mode" if arg1.is_empty() => Command::Unknown("/mode requires a subcommand: chat, bash, help, settings".to_string()),
|
2026-07-11 18:23:01 +07:00
|
|
|
"/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,
|
2026-07-11 21:06:22 +07:00
|
|
|
"/lesson" if arg1 == "accept" && !arg2.is_empty() => Command::LessonAccept(arg2.to_string()),
|
|
|
|
|
"/lesson" if arg1 == "reject" && !arg2.is_empty() => Command::LessonReject(arg2.to_string()),
|
2026-07-11 18:23:01 +07:00
|
|
|
"/lesson" if !arg1.is_empty() => Command::LessonCreate(arg1.to_string()),
|
|
|
|
|
"/lesson" => Command::LessonList,
|
2026-07-12 02:06:46 +07:00
|
|
|
"/login" if arg1.is_empty() => Command::LessonList,
|
2026-07-11 20:21:59 +07:00
|
|
|
"/login" if !arg1.is_empty() => Command::Login { provider: arg1.to_string() },
|
2026-07-12 01:25:52 +07:00
|
|
|
"/edit" if !arg1.is_empty() => Command::Edit(arg1.to_string()),
|
|
|
|
|
"/edit" => Command::Edit(".".to_string()),
|
2026-07-12 02:06:46 +07:00
|
|
|
"/mcp" if arg1.is_empty() => {
|
|
|
|
|
Command::Mode(ModeKind::Mcp)
|
|
|
|
|
}
|
2026-07-12 01:25:52 +07:00
|
|
|
"/mcp" if arg1 == "add" && !arg2.is_empty() => {
|
|
|
|
|
let rest = arg2.trim();
|
|
|
|
|
if let Some(space) = rest.find(' ') {
|
|
|
|
|
let name = rest[..space].to_string();
|
|
|
|
|
let command = rest[space + 1..].trim().to_string();
|
|
|
|
|
Command::McpAdd { name, command }
|
|
|
|
|
} else {
|
2026-07-12 02:06:46 +07:00
|
|
|
Command::McpAdd { name: rest.to_string(), command: String::new() }
|
2026-07-12 01:25:52 +07:00
|
|
|
}
|
|
|
|
|
}
|
2026-07-12 02:19:08 +07:00
|
|
|
"/model" => Command::ModelList,
|
2026-07-11 18:23:01 +07:00
|
|
|
_ => Command::Unknown(cmd.to_string()),
|
|
|
|
|
}
|
|
|
|
|
}
|