#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Tool {
Read,
Write,
Edit,
Bash,
Glob,
Grep,
Task,
WebFetch,
WebSearch,
NotebookEdit,
AskUserQuestion,
TodoWrite,
KillShell,
TaskOutput,
}
impl Tool {
pub fn as_str(&self) -> &'static str {
match self {
Tool::Read => "Read",
Tool::Write => "Write",
Tool::Edit => "Edit",
Tool::Bash => "Bash",
Tool::Glob => "Glob",
Tool::Grep => "Grep",
Tool::Task => "Task",
Tool::WebFetch => "WebFetch",
Tool::WebSearch => "WebSearch",
Tool::NotebookEdit => "NotebookEdit",
Tool::AskUserQuestion => "AskUserQuestion",
Tool::TodoWrite => "TodoWrite",
Tool::KillShell => "KillShell",
Tool::TaskOutput => "TaskOutput",
}
}
pub fn all() -> &'static [Tool] {
&[
Tool::Read,
Tool::Write,
Tool::Edit,
Tool::Bash,
Tool::Glob,
Tool::Grep,
Tool::Task,
Tool::WebFetch,
Tool::WebSearch,
Tool::NotebookEdit,
Tool::AskUserQuestion,
Tool::TodoWrite,
Tool::KillShell,
Tool::TaskOutput,
]
}
}
impl std::fmt::Display for Tool {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tool_as_str() {
assert_eq!(Tool::Read.as_str(), "Read");
assert_eq!(Tool::Write.as_str(), "Write");
assert_eq!(Tool::Edit.as_str(), "Edit");
assert_eq!(Tool::Bash.as_str(), "Bash");
assert_eq!(Tool::Glob.as_str(), "Glob");
assert_eq!(Tool::Grep.as_str(), "Grep");
}
#[test]
fn test_tool_display() {
assert_eq!(format!("{}", Tool::Read), "Read");
assert_eq!(format!("{}", Tool::Bash), "Bash");
}
#[test]
fn test_tool_all() {
let all = Tool::all();
assert!(all.contains(&Tool::Read));
assert!(all.contains(&Tool::Write));
assert!(all.contains(&Tool::Bash));
}
#[test]
fn test_tool_equality() {
assert_eq!(Tool::Read, Tool::Read);
assert_ne!(Tool::Read, Tool::Write);
}
#[test]
fn test_tool_clone() {
let tool = Tool::Read;
let cloned = tool.clone();
assert_eq!(tool, cloned);
}
}