Skip to main content

rust_mcp_sdk/mcp_http/
error.rs

1use thiserror::Error;
2
3pub type McpHttpResult<T> = core::result::Result<T, McpHttpError>;
4
5#[derive(Debug, Clone, Error)]
6pub enum McpHttpError {
7    #[error("'sessionId' query string is missing!")]
8    SessionIdMissing,
9
10    #[error("No session found for the given ID: {0}.")]
11    SessionIdInvalid(String),
12
13    #[error("Stream IO Error: {0}.")]
14    StreamIoError(String),
15
16    #[error("{0}")]
17    HttpError(String),
18
19    #[error("{0}")]
20    TransportError(String),
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn display_session_id_missing() {
29        let err = McpHttpError::SessionIdMissing;
30        assert_eq!(format!("{}", err), "'sessionId' query string is missing!");
31    }
32
33    #[test]
34    fn display_session_id_invalid() {
35        let err = McpHttpError::SessionIdInvalid("abc-123".into());
36        assert_eq!(
37            format!("{}", err),
38            "No session found for the given ID: abc-123."
39        );
40    }
41
42    #[test]
43    fn display_stream_io_error() {
44        let err = McpHttpError::StreamIoError("broken pipe".into());
45        assert_eq!(format!("{}", err), "Stream IO Error: broken pipe.");
46    }
47
48    #[test]
49    fn display_http_error() {
50        let err = McpHttpError::HttpError("bad request".into());
51        assert_eq!(format!("{}", err), "bad request");
52    }
53
54    #[test]
55    fn display_transport_error() {
56        let err = McpHttpError::TransportError("timeout".into());
57        assert_eq!(format!("{}", err), "timeout");
58    }
59
60    #[test]
61    fn clone_preserves_value() {
62        let err = McpHttpError::SessionIdInvalid("xyz".into());
63        let cloned = err.clone();
64        assert_eq!(format!("{}", err), format!("{}", cloned));
65    }
66
67    #[test]
68    fn debug_format_includes_variant() {
69        let err = McpHttpError::SessionIdMissing;
70        let debug = format!("{:?}", err);
71        assert!(debug.contains("SessionIdMissing"));
72    }
73
74    #[test]
75    fn clone_unit_variant() {
76        let err = McpHttpError::SessionIdMissing;
77        let cloned = err.clone();
78        assert_eq!(format!("{:?}", err), format!("{:?}", cloned));
79    }
80
81    #[test]
82    fn http_result_ok() {
83        let result: McpHttpResult<i32> = Ok(42);
84        assert_eq!(result.unwrap(), 42);
85    }
86
87    #[test]
88    fn http_result_err() {
89        let result: McpHttpResult<i32> = Err(McpHttpError::HttpError("fail".into()));
90        assert!(result.is_err());
91        assert_eq!(format!("{}", result.unwrap_err()), "fail");
92    }
93}