use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolKind {
Read,
Edit,
Write,
Execute,
Search,
Fetch,
WebSearch,
Other,
}
impl ToolKind {
pub fn from_acp_tool_name(name: &str) -> Self {
match name {
"Read" => ToolKind::Read,
"Edit" => ToolKind::Edit,
"Write" => ToolKind::Write,
"Bash" => ToolKind::Execute,
"Grep" => ToolKind::Search,
"Glob" => ToolKind::Search,
"WebFetch" => ToolKind::Fetch,
"WebSearch" => ToolKind::WebSearch,
_ => ToolKind::Other,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tool_kind_serialises_snake_case() {
let json = serde_json::to_string(&ToolKind::WebSearch).unwrap();
assert_eq!(json, r#""web_search""#);
let json = serde_json::to_string(&ToolKind::Read).unwrap();
assert_eq!(json, r#""read""#);
let json = serde_json::to_string(&ToolKind::Write).unwrap();
assert_eq!(json, r#""write""#);
let json = serde_json::to_string(&ToolKind::Other).unwrap();
assert_eq!(json, r#""other""#);
}
#[test]
fn from_acp_tool_name_maps_correctly() {
assert_eq!(ToolKind::from_acp_tool_name("Read"), ToolKind::Read);
assert_eq!(ToolKind::from_acp_tool_name("Write"), ToolKind::Write);
assert_eq!(ToolKind::from_acp_tool_name("Edit"), ToolKind::Edit);
assert_eq!(ToolKind::from_acp_tool_name("Bash"), ToolKind::Execute);
assert_eq!(ToolKind::from_acp_tool_name("Grep"), ToolKind::Search);
assert_eq!(ToolKind::from_acp_tool_name("Glob"), ToolKind::Search);
assert_eq!(ToolKind::from_acp_tool_name("WebFetch"), ToolKind::Fetch);
assert_eq!(
ToolKind::from_acp_tool_name("WebSearch"),
ToolKind::WebSearch
);
assert_eq!(ToolKind::from_acp_tool_name("UnknownTool"), ToolKind::Other);
}
}