1use thiserror::Error;
12
13pub type ComputerResult<T> = Result<T, ComputerError>;
15
16#[derive(Debug, Error)]
18pub enum ComputerError {
19 #[error("Tool name duplicated: {tool_name} in servers: {servers:?}")]
20 ToolNameDuplicated {
22 tool_name: String,
23 servers: Vec<String>,
24 },
25
26 #[error("Input not found: {input_id}")]
27 InputNotFound { input_id: String },
29
30 #[error("Server {server_name} is not active")]
31 ServerNotActive { server_name: String },
33
34 #[error("VRL syntax error: {message}")]
35 VrlSyntaxError { message: String },
37
38 #[error("Tool execution timeout after {timeout}s")]
39 ToolExecutionTimeout { timeout: u64 },
41
42 #[error("MCP client error: {0}")]
43 McpClientError(#[from] McpClientError),
45
46 #[error("IO error: {0}")]
47 IoError(#[from] std::io::Error),
49
50 #[error("Serialization error: {0}")]
51 SerializationError(#[from] serde_json::Error),
53
54 #[error("Transport error: {0}")]
55 TransportError(String),
57
58 #[error("Invalid configuration: {0}")]
59 InvalidConfiguration(String),
61
62 #[error("Connection error: {0}")]
63 ConnectionError(String),
65
66 #[error("Runtime error: {0}")]
67 RuntimeError(String),
69
70 #[error("Permission error: {0}")]
71 PermissionError(String),
73
74 #[error("Timeout error: {0}")]
75 TimeoutError(String),
77
78 #[error("Protocol error: {0}")]
79 ProtocolError(String),
81
82 #[error("Socket.IO error: {0}")]
83 SocketIoError(String),
85
86 #[error("Validation error: {0}")]
87 ValidationError(String),
89
90 #[error("Invalid state: {0}")]
91 InvalidState(String),
93
94 #[error("Render error: {0}")]
95 RenderError(String),
97}
98
99impl From<Box<dyn std::error::Error + Send + Sync>> for ComputerError {
100 fn from(err: Box<dyn std::error::Error + Send + Sync>) -> Self {
101 ComputerError::RuntimeError(err.to_string())
102 }
103}
104
105impl From<crate::mcp_clients::RenderError> for ComputerError {
106 fn from(err: crate::mcp_clients::RenderError) -> Self {
107 ComputerError::RenderError(err.to_string())
108 }
109}
110
111impl ComputerError {
112 pub fn error_code(&self) -> i32 {
115 match self {
116 ComputerError::ToolNameDuplicated { .. } => 4002, ComputerError::ToolExecutionTimeout { .. } => 4004, ComputerError::InputNotFound { .. } => 404, ComputerError::ServerNotActive { .. } => 404, ComputerError::VrlSyntaxError { .. } => 400, ComputerError::ValidationError(_) => 400, ComputerError::InvalidConfiguration(_) => 400, ComputerError::RenderError(_) => 400, ComputerError::ConnectionError(_) => 500, ComputerError::TransportError(_) => 500, ComputerError::SocketIoError(_) => 500, ComputerError::TimeoutError(_) => 408, ComputerError::PermissionError(_) => 403, ComputerError::ProtocolError(_) => 500, ComputerError::InvalidState(_) => 400, ComputerError::McpClientError(e) => e.error_code(),
151
152 ComputerError::IoError(_) => 500, ComputerError::SerializationError(_) => 400, ComputerError::RuntimeError(_) => 500, }
159 }
160}
161
162impl McpClientError {
163 pub fn error_code(&self) -> i32 {
165 match self {
166 McpClientError::NotConnected => 500, McpClientError::ConnectionFailed(_) => 500, McpClientError::ConnectionError(_) => 500, McpClientError::ToolCallFailed(_) => 4003, McpClientError::InvalidState(_) => 400, McpClientError::ProcessError(_) => 500, McpClientError::TimeoutError(_) => 408, McpClientError::ProtocolError(_) => 500, McpClientError::ToolError(_) => 4003, McpClientError::ConfigError(_) => 400, McpClientError::InternalError(_) => 500, }
178 }
179}
180
181#[derive(Debug, Error)]
183pub enum McpClientError {
184 #[error("Not connected to server")]
185 NotConnected,
187
188 #[error("Connection failed: {0}")]
189 ConnectionFailed(String),
191
192 #[error("Connection error: {0}")]
193 ConnectionError(String),
195
196 #[error("Tool call failed: {0}")]
197 ToolCallFailed(String),
199
200 #[error("Invalid state: {0}")]
201 InvalidState(String),
203
204 #[error("Process error: {0}")]
205 ProcessError(String),
207
208 #[error("Timeout error: {0}")]
209 TimeoutError(String),
211
212 #[error("Protocol error: {0}")]
213 ProtocolError(String),
215
216 #[error("Tool error: {0}")]
217 ToolError(String),
219
220 #[error("Config error: {0}")]
221 ConfigError(String),
223
224 #[error("Internal error: {0}")]
225 InternalError(String),
227}