rmcp_openapi/
error.rs

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}