claude_agent/types/tool/
reference.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct ToolReference {
7 #[serde(rename = "type")]
8 pub ref_type: String,
9 pub tool_name: String,
10}
11
12impl ToolReference {
13 pub fn new(tool_name: impl Into<String>) -> Self {
14 Self {
15 ref_type: "tool_reference".to_string(),
16 tool_name: tool_name.into(),
17 }
18 }
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct ToolSearchResult {
23 #[serde(rename = "type")]
24 pub result_type: String,
25 pub tool_references: Vec<ToolReference>,
26}
27
28impl ToolSearchResult {
29 pub fn new(tool_names: impl IntoIterator<Item = impl Into<String>>) -> Self {
30 Self {
31 result_type: "tool_search_tool_search_result".to_string(),
32 tool_references: tool_names.into_iter().map(ToolReference::new).collect(),
33 }
34 }
35
36 pub fn tool_names(&self) -> impl Iterator<Item = &str> {
37 self.tool_references.iter().map(|r| r.tool_name.as_str())
38 }
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct ToolSearchToolResult {
43 pub tool_use_id: String,
44 pub content: ToolSearchResultContent,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum ToolSearchResultContent {
50 #[serde(rename = "tool_search_tool_search_result")]
51 SearchResult { tool_references: Vec<ToolReference> },
52 #[serde(rename = "tool_search_tool_result_error")]
53 Error { error_code: ToolSearchErrorCode },
54}
55
56#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
57#[serde(rename_all = "snake_case")]
58pub enum ToolSearchErrorCode {
59 TooManyRequests,
60 InvalidPattern,
61 PatternTooLong,
62 Unavailable,
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn test_tool_reference_serialization() {
71 let reference = ToolReference::new("get_weather");
72 let json = serde_json::to_string(&reference).unwrap();
73 assert!(json.contains("tool_reference"));
74 assert!(json.contains("get_weather"));
75 }
76
77 #[test]
78 fn test_tool_search_result() {
79 let result = ToolSearchResult::new(["tool_a", "tool_b"]);
80 assert_eq!(result.tool_references.len(), 2);
81 let names: Vec<_> = result.tool_names().collect();
82 assert_eq!(names, vec!["tool_a", "tool_b"]);
83 }
84}