use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("Protocol error: {0}")]
Protocol(String),
#[error("Tool execution error: {0}")]
ToolExecution(String),
#[error("Resource access error: {0}")]
ResourceAccess(String),
#[error("Transport error: {0}")]
Transport(String),
#[error("Timeout error: {0}")]
Timeout(String),
#[error("Execution cancelled: {0}")]
Cancelled(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error(transparent)]
Other(#[from] anyhow::Error),
}
impl Clone for Error {
fn clone(&self) -> Self {
match self {
Error::Protocol(s) => Error::Protocol(s.clone()),
Error::ToolExecution(s) => Error::ToolExecution(s.clone()),
Error::ResourceAccess(s) => Error::ResourceAccess(s.clone()),
Error::Transport(s) => Error::Transport(s.clone()),
Error::Timeout(s) => Error::Timeout(s.clone()),
Error::Cancelled(s) => Error::Cancelled(s.clone()),
Error::InvalidInput(s) => Error::InvalidInput(s.clone()),
Error::Io(e) => Error::Io(std::io::Error::other(e.to_string())),
Error::Json(e) => {
let json_error_msg = e.to_string();
Error::Json(
serde_json::from_str::<serde_json::Value>(&format!("\"{json_error_msg}\""))
.unwrap_err(),
)
}
Error::Other(e) => Error::Other(anyhow::anyhow!(e.to_string())),
}
}
}
pub type Result<T> = std::result::Result<T, Error>;