1use rmcp::model::{ErrorCode, ErrorData};
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum OpenApiError {
6 #[error("Environment variable error: {0}")]
7 EnvVar(#[from] std::env::VarError),
8 #[error("IO error: {0}")]
9 Io(#[from] std::io::Error),
10 #[error("HTTP request error: {0}")]
11 HttpRequest(#[from] reqwest::Error),
12 #[error("HTTP error: {0}")]
13 Http(String),
14 #[error("JSON parsing error: {0}")]
15 Json(#[from] serde_json::Error),
16 #[error("OpenAPI spec error: {0}")]
17 Spec(String),
18 #[error("Tool generation error: {0}")]
19 ToolGeneration(String),
20 #[error("Parameter validation error: {0}")]
21 Validation(String),
22 #[error("Tool not found: {0}")]
23 ToolNotFound(String),
24 #[error("Invalid parameter: {parameter} - {reason}")]
25 InvalidParameter { parameter: String, reason: String },
26 #[error("Invalid parameter location: {0}")]
27 InvalidParameterLocation(String),
28 #[error("Invalid URL: {0}")]
29 InvalidUrl(String),
30 #[error("File not found: {0}")]
31 FileNotFound(String),
32 #[error("MCP error: {0}")]
33 McpError(String),
34 #[error("Invalid path: {0}")]
35 InvalidPath(String),
36}
37
38impl From<OpenApiError> for ErrorData {
39 fn from(err: OpenApiError) -> Self {
40 match err {
41 OpenApiError::ToolNotFound(tool_name) => ErrorData::new(
42 ErrorCode(-32601),
43 format!("Tool '{tool_name}' not found"),
44 None,
45 ),
46 OpenApiError::InvalidParameter { parameter, reason } => ErrorData::new(
47 ErrorCode(-32602),
48 format!("Invalid parameter '{parameter}': {reason}"),
49 None,
50 ),
51 OpenApiError::Validation(msg) => {
52 ErrorData::new(ErrorCode(-32602), format!("Validation error: {msg}"), None)
53 }
54 OpenApiError::HttpRequest(e) => {
55 ErrorData::new(ErrorCode(-32000), format!("HTTP request failed: {e}"), None)
56 }
57 OpenApiError::Http(msg) => {
58 ErrorData::new(ErrorCode(-32000), format!("HTTP error: {msg}"), None)
59 }
60 OpenApiError::Spec(msg) => ErrorData::new(
61 ErrorCode(-32700),
62 format!("OpenAPI spec error: {msg}"),
63 None,
64 ),
65 OpenApiError::Json(e) => {
66 ErrorData::new(ErrorCode(-32700), format!("JSON parsing error: {e}"), None)
67 }
68 _ => ErrorData::new(ErrorCode(-32000), err.to_string(), None),
69 }
70 }
71}