use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PluginErrorCode {
InvalidInput,
NotFound,
Conflict,
PermissionDenied,
Unavailable,
Timeout,
Internal,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, thiserror::Error)]
#[error("{code:?}: {message}")]
pub struct PluginError {
pub code: PluginErrorCode,
pub message: String,
}
impl PluginError {
pub fn new(code: PluginErrorCode, message: impl Into<String>) -> Self {
Self {
code,
message: message.into(),
}
}
pub fn invalid_input(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::InvalidInput, message)
}
pub fn not_found(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::NotFound, message)
}
pub fn conflict(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::Conflict, message)
}
pub fn permission_denied(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::PermissionDenied, message)
}
pub fn unavailable(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::Unavailable, message)
}
pub fn timeout(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::Timeout, message)
}
pub fn internal(message: impl Into<String>) -> Self {
Self::new(PluginErrorCode::Internal, message)
}
}
pub type PluginResult<T> = Result<T, PluginError>;