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}
29
30impl From<OpenApiError> for ErrorData {
31 fn from(err: OpenApiError) -> Self {
32 match err {
33 OpenApiError::ToolNotFound(tool_name) => ErrorData::new(
34 ErrorCode(-32601),
35 format!("Tool '{tool_name}' not found"),
36 None,
37 ),
38 OpenApiError::InvalidParameter { parameter, reason } => ErrorData::new(
39 ErrorCode(-32602),
40 format!("Invalid parameter '{parameter}': {reason}"),
41 None,
42 ),
43 OpenApiError::Validation(msg) => {
44 ErrorData::new(ErrorCode(-32602), format!("Validation error: {msg}"), None)
45 }
46 OpenApiError::HttpRequest(e) => {
47 ErrorData::new(ErrorCode(-32000), format!("HTTP request failed: {e}"), None)
48 }
49 OpenApiError::Http(msg) => {
50 ErrorData::new(ErrorCode(-32000), format!("HTTP error: {msg}"), None)
51 }
52 OpenApiError::Spec(msg) => ErrorData::new(
53 ErrorCode(-32700),
54 format!("OpenAPI spec error: {msg}"),
55 None,
56 ),
57 OpenApiError::Json(e) => {
58 ErrorData::new(ErrorCode(-32700), format!("JSON parsing error: {e}"), None)
59 }
60 _ => ErrorData::new(ErrorCode(-32000), err.to_string(), None),
61 }
62 }
63}