use thiserror::Error;
#[derive(Debug, Error)]
pub enum FsError {
#[error("Path not allowed: {0}")]
PathNotAllowed(String),
#[error("Not found: {0}")]
NotFound(String),
#[error("Not a directory: {0}")]
NotDirectory(String),
#[error("Not a file: {0}")]
NotFile(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid path: {0}")]
InvalidPath(String),
#[error("Encoding error: {0}")]
Encoding(String),
#[error("File too large")]
FileTooLarge,
#[error("Operation not supported: {0}")]
NotSupported(String),
}
impl From<FsError> for rmcp::ErrorData {
fn from(err: FsError) -> Self {
match err {
FsError::PathNotAllowed(path) => {
rmcp::ErrorData::invalid_params(format!("Path not allowed: {}", path), None)
}
FsError::PermissionDenied(msg) => {
rmcp::ErrorData::invalid_params(format!("Permission denied: {}", msg), None)
}
FsError::NotFound(path) => {
rmcp::ErrorData::invalid_params(format!("Not found: {}", path), None)
}
FsError::NotDirectory(path) => {
rmcp::ErrorData::invalid_params(format!("Not a directory: {}", path), None)
}
FsError::NotFile(path) => {
rmcp::ErrorData::invalid_params(format!("Not a file: {}", path), None)
}
_ => rmcp::ErrorData::internal_error(err.to_string(), None),
}
}
}
#[allow(dead_code)]
pub type Result<T> = std::result::Result<T, FsError>;