use strum::Display;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Display)]
pub enum Tool {
Bash,
Read,
Write,
Edit,
Glob,
Grep,
WebFetch,
WebSearch,
NotebookEdit,
TodoWrite,
Task,
#[strum(transparent)]
Custom(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_tools_use_the_claude_code_names() {
let names: Vec<String> = [
Tool::Bash,
Tool::Read,
Tool::Write,
Tool::Edit,
Tool::Glob,
Tool::Grep,
Tool::WebFetch,
Tool::WebSearch,
Tool::NotebookEdit,
Tool::TodoWrite,
Tool::Task,
]
.iter()
.map(Tool::to_string)
.collect::<Vec<_>>();
assert_eq!(
names,
vec![
"Bash",
"Read",
"Write",
"Edit",
"Glob",
"Grep",
"WebFetch",
"WebSearch",
"NotebookEdit",
"TodoWrite",
"Task"
]
);
}
#[test]
fn custom_tools_are_passed_verbatim() {
assert_eq!(
Tool::Custom("mcp__github__search".to_string()).to_string(),
"mcp__github__search"
);
assert_eq!(
Tool::Custom("Bash(git log:*)".to_string()).to_string(),
"Bash(git log:*)"
);
assert_eq!(Tool::Custom("é".to_string()).to_string(), "é");
}
}