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")]
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)]
35 #[diagnostic(transparent)]
36 Duplicate(Duplicate),
37 #[error("transitive closure computation/enforcement error")]
40 #[diagnostic(transparent)]
41 TransitiveClosureError(#[from] TransitiveClosureError),
42 #[error("entity does not conform to the schema")]
44 #[diagnostic(transparent)]
45 InvalidEntity(#[from] crate::entities::conformance::err::EntitySchemaConformanceError),
46}
47
48impl EntitiesError {
49 pub(crate) fn duplicate(euid: EntityUID) -> Self {
50 Self::Duplicate(Duplicate { euid })
51 }
52}
53
54impl From<transitive_closure::TcError<EntityUID>> for EntitiesError {
55 fn from(value: transitive_closure::TcError<EntityUID>) -> Self {
56 let tc: TransitiveClosureError = value.into();
57 tc.into()
58 }
59}
60
61#[derive(Debug, Error, Diagnostic)]
62#[error(transparent)]
63#[diagnostic(transparent)]
64pub struct TransitiveClosureError {
67 err: Box<transitive_closure::TcError<EntityUID>>,
68}
69
70impl TransitiveClosureError {
71 #[cfg(test)]
72 pub(crate) fn inner(&self) -> &transitive_closure::TcError<EntityUID> {
73 self.err.as_ref()
74 }
75}
76
77impl From<transitive_closure::TcError<EntityUID>> for TransitiveClosureError {
78 fn from(v: transitive_closure::TcError<EntityUID>) -> Self {
79 Self { err: Box::new(v) }
80 }
81}
82
83#[derive(Debug, PartialEq, Eq, Error, Diagnostic)]
84#[error("duplicate entity entry `{}`", .euid)]
85pub struct Duplicate {
87 euid: EntityUID,
89}
90
91impl Duplicate {
92 #[cfg(test)]
93 pub(crate) fn euid(&self) -> &EntityUID {
94 &self.euid
95 }
96}
97
98pub type Result<T> = std::result::Result<T, EntitiesError>;