mcp_server_fishcode2025/
errors.rs

1use mcp_core_fishcode2025::handler::ResourceError;
2use mcp_core_fishcode2025::protocol::{
3    ErrorData, INTERNAL_ERROR, INVALID_PARAMS, INVALID_REQUEST, METHOD_NOT_FOUND,
4};
5use thiserror::Error;
6
7pub type BoxError = Box<dyn std::error::Error + Sync + Send>;
8
9#[derive(Error, Debug)]
10pub enum TransportError {
11    #[error("IO error: {0}")]
12    Io(#[from] std::io::Error),
13
14    #[error("JSON serialization error: {0}")]
15    Json(#[from] serde_json::Error),
16
17    #[error("Invalid UTF-8 sequence: {0}")]
18    Utf8(#[from] std::string::FromUtf8Error),
19
20    #[error("Protocol error: {0}")]
21    Protocol(String),
22
23    #[error("Invalid message format: {0}")]
24    InvalidMessage(String),
25}
26
27#[derive(Error, Debug)]
28pub enum ServerError {
29    #[error("Transport error: {0}")]
30    Transport(#[from] TransportError),
31
32    #[error("Service error: {0}")]
33    Service(String),
34
35    #[error("Internal error: {0}")]
36    Internal(String),
37
38    #[error("Request timed out")]
39    Timeout(#[from] tower::timeout::error::Elapsed),
40}
41
42#[derive(Error, Debug)]
43pub enum RouterError {
44    #[error("Method not found: {0}")]
45    MethodNotFound(String),
46
47    #[error("Invalid parameters: {0}")]
48    InvalidParams(String),
49
50    #[error("Internal error: {0}")]
51    Internal(String),
52
53    #[error("Tool not found: {0}")]
54    ToolNotFound(String),
55
56    #[error("Resource not found: {0}")]
57    ResourceNotFound(String),
58
59    #[error("Not found: {0}")]
60    PromptNotFound(String),
61}
62
63impl From<RouterError> for ErrorData {
64    fn from(err: RouterError) -> Self {
65        match err {
66            RouterError::MethodNotFound(msg) => ErrorData {
67                code: METHOD_NOT_FOUND,
68                message: msg,
69                data: None,
70            },
71            RouterError::InvalidParams(msg) => ErrorData {
72                code: INVALID_PARAMS,
73                message: msg,
74                data: None,
75            },
76            RouterError::Internal(msg) => ErrorData {
77                code: INTERNAL_ERROR,
78                message: msg,
79                data: None,
80            },
81            RouterError::ToolNotFound(msg) => ErrorData {
82                code: INVALID_REQUEST,
83                message: msg,
84                data: None,
85            },
86            RouterError::ResourceNotFound(msg) => ErrorData {
87                code: INVALID_REQUEST,
88                message: msg,
89                data: None,
90            },
91            RouterError::PromptNotFound(msg) => ErrorData {
92                code: INVALID_REQUEST,
93                message: msg,
94                data: None,
95            },
96        }
97    }
98}
99
100impl From<ResourceError> for RouterError {
101    fn from(err: ResourceError) -> Self {
102        match err {
103            ResourceError::NotFound(msg) => RouterError::ResourceNotFound(msg),
104            ResourceError::ExecutionError(msg) => {
105                RouterError::Internal(format!("Resource execution error: {}", msg))
106            }
107        }
108    }
109}