claude_code_sdk/
types.rs

1//! Type definitions for Claude SDK.
2
3use std::collections::HashMap;
4use std::path::PathBuf;
5use serde::{Deserialize, Serialize};
6
7/// Permission modes for tool execution
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub enum PermissionMode {
11    #[serde(rename = "default")]
12    Default,
13    #[serde(rename = "acceptEdits")]
14    AcceptEdits,
15    #[serde(rename = "bypassPermissions")]
16    BypassPermissions,
17}
18
19/// MCP server configuration
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct McpServerConfig {
22    pub transport: Vec<String>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub env: Option<HashMap<String, serde_json::Value>>,
25}
26
27/// Text content block
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct TextBlock {
30    pub text: String,
31}
32
33/// Tool use content block
34#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ToolUseBlock {
36    pub id: String,
37    pub name: String,
38    pub input: HashMap<String, serde_json::Value>,
39}
40
41/// Tool result content block
42#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct ToolResultBlock {
44    pub tool_use_id: String,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub content: Option<ToolResultContent>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    pub is_error: Option<bool>,
49}
50
51/// Tool result content can be string or structured data
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(untagged)]
54pub enum ToolResultContent {
55    Text(String),
56    Structured(Vec<HashMap<String, serde_json::Value>>),
57}
58
59/// Content block types
60#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(tag = "type")]
62pub enum ContentBlock {
63    #[serde(rename = "text")]
64    Text(TextBlock),
65    #[serde(rename = "tool_use")]
66    ToolUse(ToolUseBlock),
67    #[serde(rename = "tool_result")]
68    ToolResult(ToolResultBlock),
69}
70
71/// User message
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct UserMessage {
74    pub content: String,
75}
76
77/// Assistant message with content blocks
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct AssistantMessage {
80    pub content: Vec<ContentBlock>,
81}
82
83/// System message with metadata
84#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct SystemMessage {
86    pub subtype: String,
87    pub data: HashMap<String, serde_json::Value>,
88}
89
90/// Result message with cost and usage information
91#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct ResultMessage {
93    pub subtype: String,
94    pub duration_ms: u64,
95    pub duration_api_ms: u64,
96    pub is_error: bool,
97    pub num_turns: u32,
98    pub session_id: String,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub total_cost_usd: Option<f64>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub usage: Option<HashMap<String, serde_json::Value>>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub result: Option<String>,
105}
106
107/// Message types
108#[derive(Debug, Clone, Serialize, Deserialize)]
109#[serde(tag = "type")]
110pub enum Message {
111    #[serde(rename = "user")]
112    User(UserMessage),
113    #[serde(rename = "assistant")]
114    Assistant(AssistantMessage),
115    #[serde(rename = "system")]
116    System(SystemMessage),
117    #[serde(rename = "result")]
118    Result(ResultMessage),
119}
120
121/// Query options for Claude SDK
122#[derive(Debug, Clone)]
123pub struct ClaudeCodeOptions {
124    pub allowed_tools: Vec<String>,
125    pub max_thinking_tokens: u32,
126    pub system_prompt: Option<String>,
127    pub append_system_prompt: Option<String>,
128    pub mcp_tools: Vec<String>,
129    pub mcp_servers: HashMap<String, McpServerConfig>,
130    pub permission_mode: Option<PermissionMode>,
131    pub continue_conversation: bool,
132    pub resume: Option<String>,
133    pub max_turns: Option<u32>,
134    pub disallowed_tools: Vec<String>,
135    pub model: Option<String>,
136    pub permission_prompt_tool_name: Option<String>,
137    pub cwd: Option<PathBuf>,
138}
139
140impl Default for ClaudeCodeOptions {
141    fn default() -> Self {
142        Self {
143            allowed_tools: Vec::new(),
144            max_thinking_tokens: 8000,
145            system_prompt: None,
146            append_system_prompt: None,
147            mcp_tools: Vec::new(),
148            mcp_servers: HashMap::new(),
149            permission_mode: None,
150            continue_conversation: false,
151            resume: None,
152            max_turns: None,
153            disallowed_tools: Vec::new(),
154            model: None,
155            permission_prompt_tool_name: None,
156            cwd: None,
157        }
158    }
159}
160
161impl ClaudeCodeOptions {
162    /// Create new default options
163    pub fn new() -> Self {
164        Self::default()
165    }
166}