1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, Error>;
7
8#[derive(Error, Debug)]
10pub enum Error {
11 #[error("JSON-RPC error: {code} - {message}")]
13 JsonRpc {
14 code: i32,
16 message: String,
18 data: Option<serde_json::Value>,
20 },
21
22 #[error("tool not found: {0}")]
24 ToolNotFound(String),
25
26 #[error("invalid parameters: {0}")]
28 InvalidParams(String),
29
30 #[error("permission denied: {0}")]
32 PermissionDenied(String),
33
34 #[error("webpuppet error: {0}")]
36 Webpuppet(#[from] webpuppet::Error),
37
38 #[error("serialization error: {0}")]
40 Serialization(#[from] serde_json::Error),
41
42 #[error("I/O error: {0}")]
44 Io(#[from] std::io::Error),
45
46 #[error("internal error: {0}")]
48 Internal(String),
49}
50
51impl Error {
52 pub fn code(&self) -> i32 {
54 match self {
55 Error::JsonRpc { code, .. } => *code,
56 Error::ToolNotFound(_) => -32601, Error::InvalidParams(_) => -32602, Error::PermissionDenied(_) => -32000, Error::Webpuppet(_) => -32001,
60 Error::Serialization(_) => -32700, Error::Io(_) => -32002,
62 Error::Internal(_) => -32603, }
64 }
65
66 pub fn to_json_rpc_error(&self) -> serde_json::Value {
68 serde_json::json!({
69 "code": self.code(),
70 "message": self.to_string(),
71 })
72 }
73}
74
75pub mod codes {
77 pub const PARSE_ERROR: i32 = -32700;
79 pub const INVALID_REQUEST: i32 = -32600;
81 pub const METHOD_NOT_FOUND: i32 = -32601;
83 pub const INVALID_PARAMS: i32 = -32602;
85 pub const INTERNAL_ERROR: i32 = -32603;
87}