claude_code_agent_sdk/
errors.rs1use std::path::PathBuf;
4use thiserror::Error;
5
6#[derive(Debug, Error)]
8pub enum ClaudeError {
9 #[error("CLI connection error: {0}")]
11 Connection(#[from] ConnectionError),
12
13 #[error("Process error: {0}")]
15 Process(#[from] ProcessError),
16
17 #[error("JSON decode error: {0}")]
19 JsonDecode(#[from] JsonDecodeError),
20
21 #[error("Message parse error: {0}")]
23 MessageParse(#[from] MessageParseError),
24
25 #[error("Transport error: {0}")]
27 Transport(String),
28
29 #[error("Control protocol error: {0}")]
31 ControlProtocol(String),
32
33 #[error("Invalid configuration: {0}")]
35 InvalidConfig(String),
36
37 #[error("CLI not found: {0}")]
39 CliNotFound(#[from] CliNotFoundError),
40
41 #[error("Image validation error: {0}")]
43 ImageValidation(#[from] ImageValidationError),
44
45 #[error("MCP error: {0}")]
47 Mcp(#[from] McpError),
48
49 #[error("IO error: {0}")]
51 Io(#[from] std::io::Error),
52
53 #[error(transparent)]
55 Other(#[from] anyhow::Error),
56}
57
58#[derive(Debug, Error)]
60#[error("CLI not found: {message}")]
61pub struct CliNotFoundError {
62 pub message: String,
64 pub cli_path: Option<PathBuf>,
66}
67
68impl CliNotFoundError {
69 pub fn new(message: impl Into<String>, cli_path: Option<PathBuf>) -> Self {
71 Self {
72 message: message.into(),
73 cli_path,
74 }
75 }
76}
77
78#[derive(Debug, Error)]
80#[error("Connection error: {message}")]
81pub struct ConnectionError {
82 pub message: String,
84}
85
86impl ConnectionError {
87 pub fn new(message: impl Into<String>) -> Self {
89 Self {
90 message: message.into(),
91 }
92 }
93}
94
95#[derive(Debug, Error)]
97#[error("Process error (exit code {exit_code:?}): {message}")]
98pub struct ProcessError {
99 pub message: String,
101 pub exit_code: Option<i32>,
103 pub stderr: Option<String>,
105}
106
107impl ProcessError {
108 pub fn new(message: impl Into<String>, exit_code: Option<i32>, stderr: Option<String>) -> Self {
110 Self {
111 message: message.into(),
112 exit_code,
113 stderr,
114 }
115 }
116}
117
118#[derive(Debug, Error)]
120#[error("JSON decode error: {message}")]
121pub struct JsonDecodeError {
122 pub message: String,
124 pub line: String,
126}
127
128impl JsonDecodeError {
129 pub fn new(message: impl Into<String>, line: impl Into<String>) -> Self {
131 Self {
132 message: message.into(),
133 line: line.into(),
134 }
135 }
136}
137
138#[derive(Debug, Error)]
140#[error("Message parse error: {message}")]
141pub struct MessageParseError {
142 pub message: String,
144 pub data: Option<serde_json::Value>,
146}
147
148impl MessageParseError {
149 pub fn new(message: impl Into<String>, data: Option<serde_json::Value>) -> Self {
151 Self {
152 message: message.into(),
153 data,
154 }
155 }
156}
157
158#[derive(Debug, Error)]
160#[error("Image validation error: {message}")]
161pub struct ImageValidationError {
162 pub message: String,
164}
165
166impl ImageValidationError {
167 pub fn new(message: impl Into<String>) -> Self {
169 Self {
170 message: message.into(),
171 }
172 }
173}
174
175#[derive(Debug, Error)]
177#[error("MCP error ({code}): {message}")]
178pub struct McpError {
179 pub code: i32,
181 pub message: String,
183}
184
185impl McpError {
186 pub fn new(code: i32, message: impl Into<String>) -> Self {
188 Self {
189 code,
190 message: message.into(),
191 }
192 }
193
194 pub fn method_not_found(method: &str) -> Self {
196 Self::new(-32601, format!("Method not found: {}", method))
197 }
198
199 pub fn internal_error(message: impl Into<String>) -> Self {
201 Self::new(-32603, message)
202 }
203
204 pub fn invalid_params(message: impl Into<String>) -> Self {
206 Self::new(-32602, message)
207 }
208}
209
210pub type Result<T> = std::result::Result<T, ClaudeError>;