claude_agent/types/tool/
reference.rs

1//! Tool reference types for deferred tool loading.
2
3use 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}