use std::collections::HashMap;
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum PermissionMode {
#[serde(rename = "default")]
Default,
#[serde(rename = "acceptEdits")]
AcceptEdits,
#[serde(rename = "bypassPermissions")]
BypassPermissions,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct McpServerConfig {
pub transport: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextBlock {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolUseBlock {
pub id: String,
pub name: String,
pub input: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolResultBlock {
pub tool_use_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<ToolResultContent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ToolResultContent {
Text(String),
Structured(Vec<HashMap<String, serde_json::Value>>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ContentBlock {
#[serde(rename = "text")]
Text(TextBlock),
#[serde(rename = "tool_use")]
ToolUse(ToolUseBlock),
#[serde(rename = "tool_result")]
ToolResult(ToolResultBlock),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserMessage {
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssistantMessage {
pub content: Vec<ContentBlock>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMessage {
pub subtype: String,
pub data: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResultMessage {
pub subtype: String,
pub duration_ms: u64,
pub duration_api_ms: u64,
pub is_error: bool,
pub num_turns: u32,
pub session_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub total_cost_usd: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Message {
#[serde(rename = "user")]
User(UserMessage),
#[serde(rename = "assistant")]
Assistant(AssistantMessage),
#[serde(rename = "system")]
System(SystemMessage),
#[serde(rename = "result")]
Result(ResultMessage),
}
#[derive(Debug, Clone)]
pub struct ClaudeCodeOptions {
pub allowed_tools: Vec<String>,
pub max_thinking_tokens: u32,
pub system_prompt: Option<String>,
pub append_system_prompt: Option<String>,
pub mcp_tools: Vec<String>,
pub mcp_servers: HashMap<String, McpServerConfig>,
pub permission_mode: Option<PermissionMode>,
pub continue_conversation: bool,
pub resume: Option<String>,
pub max_turns: Option<u32>,
pub disallowed_tools: Vec<String>,
pub model: Option<String>,
pub permission_prompt_tool_name: Option<String>,
pub cwd: Option<PathBuf>,
}
impl Default for ClaudeCodeOptions {
fn default() -> Self {
Self {
allowed_tools: Vec::new(),
max_thinking_tokens: 8000,
system_prompt: None,
append_system_prompt: None,
mcp_tools: Vec::new(),
mcp_servers: HashMap::new(),
permission_mode: None,
continue_conversation: false,
resume: None,
max_turns: None,
disallowed_tools: Vec::new(),
model: None,
permission_prompt_tool_name: None,
cwd: None,
}
}
}
impl ClaudeCodeOptions {
pub fn new() -> Self {
Self::default()
}
}