use cedar_policy::{
ContextCreationError, EntityAttrEvaluationError, ParseErrors, RequestValidationError,
};
use cedar_policy_core::entities::err::EntitiesError;
use serde::{Deserialize, Serialize};
use std::sync::{PoisonError, RwLockReadGuard};
use thiserror::Error;
#[derive(Debug, Error, Serialize, Deserialize)]
pub enum PolicyError {
#[error("failed to lock policy set for read/write: {0}")]
LockError(String),
#[error("failed to parse policy: {0}")]
ParseError(String),
#[error("evaluation error: {0}")]
EvalError(String),
#[error("request validation error: {0}")]
RequestValidationError(String),
#[error("context creation error: {0}")]
ContextError(String),
#[error("entity error: {0}")]
EntityError(String),
#[error("poisoned lock error: {0}")]
PoisonedLockError(String),
#[error("qualified ID error: {0}")]
QualifiedIdError(String),
#[error("invalid format: {0}")]
InvalidFormat(String),
#[error("entity attribute error: {0}")]
EntityAttrError(String),
}
impl From<RequestValidationError> for PolicyError {
fn from(err: cedar_policy::RequestValidationError) -> Self {
PolicyError::RequestValidationError(err.to_string())
}
}
impl From<ParseErrors> for PolicyError {
fn from(err: ParseErrors) -> Self {
PolicyError::ParseError(err.to_string())
}
}
impl From<ContextCreationError> for PolicyError {
fn from(err: ContextCreationError) -> Self {
PolicyError::ContextError(err.to_string())
}
}
impl From<EntityAttrEvaluationError> for PolicyError {
fn from(err: EntityAttrEvaluationError) -> Self {
PolicyError::EntityAttrError(err.to_string())
}
}
impl From<EntitiesError> for PolicyError {
fn from(err: EntitiesError) -> Self {
PolicyError::EntityError(err.to_string())
}
}
impl From<PoisonError<RwLockReadGuard<'_, cedar_policy::PolicySet>>> for PolicyError {
fn from(err: PoisonError<RwLockReadGuard<'_, cedar_policy::PolicySet>>) -> Self {
PolicyError::PoisonedLockError(err.to_string())
}
}