mcp_server_fishcode2025/
errors.rs1use 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}