use thiserror::Error;
#[derive(Error, Debug)]
pub enum OsoError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Polar(#[from] polar_core::error::PolarError),
#[error("failed to convert type from Polar")]
FromPolar,
#[error("policy files must have the .polar extension. {filename} does not.")]
IncorrectFileType { filename: String },
#[error("Invariant error: {source}")]
InvariantError {
#[from]
source: InvariantError,
},
#[error(transparent)]
TypeError(#[from] TypeError),
#[error("Unsupported operation {operation} for type {type_name}.")]
UnsupportedOperation {
operation: String,
type_name: String,
},
#[error("{operation} are unimplemented in oso-rust.")]
UnimplementedOperation { operation: String },
#[error("failed to convert type to Polar")]
ToPolar,
#[error("Class {name} already registered")]
DuplicateClassError { name: String },
#[error("{message}")]
Custom { message: String },
}
#[derive(Error, Debug)]
pub enum InvariantError {
#[error("Invalid receiver for method. {0}")]
InvalidReceiver(#[from] TypeError),
#[error("invalid receiver - this is a bug")]
MethodNotFound,
}
#[derive(Error, Debug)]
#[error("Type error: expected `{expected}`")]
pub struct TypeError {
pub expected: String,
}
impl TypeError {
pub fn invariant(self) -> InvariantError {
InvariantError::from(self)
}
pub fn user(self) -> OsoError {
OsoError::from(self)
}
}
pub type Result<T> = std::result::Result<T, OsoError>;