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("Timeout: {0}")]
35 Timeout(String),
36
37 #[error("Invalid configuration: {0}")]
39 InvalidConfig(String),
40
41 #[error("CLI not found: {0}")]
43 CliNotFound(#[from] CliNotFoundError),
44
45 #[error("Image validation error: {0}")]
47 ImageValidation(#[from] ImageValidationError),
48
49 #[error("MCP error: {0}")]
51 Mcp(#[from] McpError),
52
53 #[error("IO error: {0}")]
55 Io(#[from] std::io::Error),
56
57 #[error(transparent)]
59 Other(#[from] anyhow::Error),
60}
61
62#[derive(Debug, Error)]
64#[error("CLI not found: {message}")]
65pub struct CliNotFoundError {
66 pub message: String,
68 pub cli_path: Option<PathBuf>,
70}
71
72impl CliNotFoundError {
73 pub fn new(message: impl Into<String>, cli_path: Option<PathBuf>) -> Self {
75 Self {
76 message: message.into(),
77 cli_path,
78 }
79 }
80}
81
82#[derive(Debug, Error)]
84#[error("Connection error: {message}")]
85pub struct ConnectionError {
86 pub message: String,
88}
89
90impl ConnectionError {
91 pub fn new(message: impl Into<String>) -> Self {
93 Self {
94 message: message.into(),
95 }
96 }
97}
98
99#[derive(Debug, Error)]
101#[error("Process error (exit code {exit_code:?}): {message}")]
102pub struct ProcessError {
103 pub message: String,
105 pub exit_code: Option<i32>,
107 pub stderr: Option<String>,
109}
110
111impl ProcessError {
112 pub fn new(message: impl Into<String>, exit_code: Option<i32>, stderr: Option<String>) -> Self {
114 Self {
115 message: message.into(),
116 exit_code,
117 stderr,
118 }
119 }
120}
121
122#[derive(Debug, Error)]
124#[error("JSON decode error: {message}")]
125pub struct JsonDecodeError {
126 pub message: String,
128 pub line: String,
130}
131
132impl JsonDecodeError {
133 pub fn new(message: impl Into<String>, line: impl Into<String>) -> Self {
135 Self {
136 message: message.into(),
137 line: line.into(),
138 }
139 }
140}
141
142#[derive(Debug, Error)]
144#[error("Message parse error: {message}")]
145pub struct MessageParseError {
146 pub message: String,
148 pub data: Option<serde_json::Value>,
150}
151
152impl MessageParseError {
153 pub fn new(message: impl Into<String>, data: Option<serde_json::Value>) -> Self {
155 Self {
156 message: message.into(),
157 data,
158 }
159 }
160}
161
162#[derive(Debug, Error)]
164#[error("Image validation error: {message}")]
165pub struct ImageValidationError {
166 pub message: String,
168}
169
170impl ImageValidationError {
171 pub fn new(message: impl Into<String>) -> Self {
173 Self {
174 message: message.into(),
175 }
176 }
177}
178
179#[derive(Debug, Error)]
181#[error("MCP error ({code}): {message}")]
182pub struct McpError {
183 pub code: i32,
185 pub message: String,
187}
188
189impl McpError {
190 pub fn new(code: i32, message: impl Into<String>) -> Self {
192 Self {
193 code,
194 message: message.into(),
195 }
196 }
197
198 pub fn method_not_found(method: &str) -> Self {
200 Self::new(-32601, format!("Method not found: {}", method))
201 }
202
203 pub fn internal_error(message: impl Into<String>) -> Self {
205 Self::new(-32603, message)
206 }
207
208 pub fn invalid_params(message: impl Into<String>) -> Self {
210 Self::new(-32602, message)
211 }
212}
213
214pub type Result<T> = std::result::Result<T, ClaudeError>;