cedar_policy_core/entities/
err.rs1use super::EntityUID;
18use crate::transitive_closure;
19use miette::Diagnostic;
20use thiserror::Error;
21
22#[derive(Debug, Diagnostic, Error)]
24pub enum EntitiesError {
25 #[error("error during entity serialization: {0}")]
27 #[diagnostic(transparent)]
28 Serialization(#[from] crate::entities::json::err::JsonSerializationError),
29 #[error("error during entity deserialization")]
31 #[diagnostic(transparent)]
32 Deserialization(#[from] crate::entities::json::err::JsonDeserializationError),
33 #[error(transparent)]
36 #[diagnostic(transparent)]
37 Duplicate(Duplicate),
38 #[error("transitive closure computation/enforcement error")]
41 #[diagnostic(transparent)]
42 TransitiveClosureError(#[from] TransitiveClosureError),
43 #[error("entity does not conform to the schema")]
45 #[diagnostic(transparent)]
46 InvalidEntity(#[from] crate::entities::conformance::err::EntitySchemaConformanceError),
47}
48
49impl EntitiesError {
50 pub(crate) fn duplicate(euid: EntityUID) -> Self {
51 Self::Duplicate(Duplicate { euid })
52 }
53}
54
55impl From<transitive_closure::TcError<EntityUID>> for EntitiesError {
56 fn from(value: transitive_closure::TcError<EntityUID>) -> Self {
57 let tc: TransitiveClosureError = value.into();
58 tc.into()
59 }
60}
61
62#[derive(Debug, Error, Diagnostic)]
63#[error(transparent)]
64#[diagnostic(transparent)]
65pub struct TransitiveClosureError {
68 err: Box<transitive_closure::TcError<EntityUID>>,
69}
70
71#[cfg(test)]
72impl TransitiveClosureError {
73 pub(crate) fn inner(&self) -> &transitive_closure::TcError<EntityUID> {
74 self.err.as_ref()
75 }
76}
77
78impl From<transitive_closure::TcError<EntityUID>> for TransitiveClosureError {
79 fn from(v: transitive_closure::TcError<EntityUID>) -> Self {
80 Self { err: Box::new(v) }
81 }
82}
83
84#[derive(Debug, PartialEq, Eq, Error, Diagnostic)]
85#[error("duplicate entity entry `{}`", .euid)]
86pub struct Duplicate {
88 pub(crate) euid: EntityUID,
90}
91
92#[cfg(test)]
93impl Duplicate {
94 pub(crate) fn euid(&self) -> &EntityUID {
95 &self.euid
96 }
97}
98
99pub type Result<T> = std::result::Result<T, EntitiesError>;