cedar_policy_core/entities/
err.rs1use super::EntityUID;
18use crate::transitive_closure;
19use miette::Diagnostic;
20use thiserror::Error;
21
22#[derive(Debug, Diagnostic, Error)]
28pub enum EntitiesError {
29 #[error("error during entity serialization: {0}")]
31 #[diagnostic(transparent)]
32 Serialization(#[from] crate::entities::json::err::JsonSerializationError),
33 #[error("error during entity deserialization")]
35 #[diagnostic(transparent)]
36 Deserialization(#[from] crate::entities::json::err::JsonDeserializationError),
37 #[error(transparent)]
40 #[diagnostic(transparent)]
41 Duplicate(Duplicate),
42 #[error("transitive closure computation/enforcement error")]
45 #[diagnostic(transparent)]
46 TransitiveClosureError(#[from] TransitiveClosureError),
47 #[error("entity does not conform to the schema")]
49 #[diagnostic(transparent)]
50 InvalidEntity(#[from] crate::entities::conformance::err::EntitySchemaConformanceError),
51 #[error(transparent)]
53 #[diagnostic(transparent)]
54 InvalidEntityStructure(#[from] InvalidEntityStructureError),
55}
56
57impl EntitiesError {
58 pub(crate) fn duplicate(euid: EntityUID) -> Self {
59 Self::Duplicate(Duplicate { euid })
60 }
61}
62
63impl From<transitive_closure::TcError<EntityUID>> for EntitiesError {
64 fn from(value: transitive_closure::TcError<EntityUID>) -> Self {
65 let tc: TransitiveClosureError = value.into();
66 tc.into()
67 }
68}
69
70#[derive(Debug, Error, Diagnostic)]
77#[error(transparent)]
78#[diagnostic(transparent)]
79pub struct TransitiveClosureError {
80 err: Box<transitive_closure::TcError<EntityUID>>,
81}
82
83#[cfg(test)]
84impl TransitiveClosureError {
85 pub(crate) fn inner(&self) -> &transitive_closure::TcError<EntityUID> {
86 self.err.as_ref()
87 }
88}
89
90impl From<transitive_closure::TcError<EntityUID>> for TransitiveClosureError {
91 fn from(v: transitive_closure::TcError<EntityUID>) -> Self {
92 Self { err: Box::new(v) }
93 }
94}
95
96#[derive(Debug, PartialEq, Eq, Error, Diagnostic)]
102#[error("duplicate entity entry `{}`", .euid)]
103pub struct Duplicate {
104 pub(crate) euid: EntityUID,
106}
107
108#[cfg(test)]
109impl Duplicate {
110 pub(crate) fn euid(&self) -> &EntityUID {
111 &self.euid
112 }
113}
114
115pub type Result<T> = std::result::Result<T, EntitiesError>;
117
118#[derive(Debug, Error, Diagnostic)]
120pub enum InvalidEntityStructureError {
121 #[error("entity `{uid}` has itself as an ancestor")]
123 SelfAncestor {
124 uid: EntityUID,
126 },
127 #[error("entity `{uid}` has `{ancestor}` in both parents and indirect ancestors")]
129 DuplicateAncestor {
130 uid: EntityUID,
132 ancestor: EntityUID,
134 },
135 #[error("action `{uid}` has a non-action parent `{parent}`")]
137 ActionParentIsNotAction {
138 uid: EntityUID,
140 parent: EntityUID,
142 },
143}