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 #[error(transparent)]
49 #[diagnostic(transparent)]
50 InvalidEntityStructure(#[from] InvalidEntityStructureError),
51}
52
53impl EntitiesError {
54 pub(crate) fn duplicate(euid: EntityUID) -> Self {
55 Self::Duplicate(Duplicate { euid })
56 }
57}
58
59impl From<transitive_closure::TcError<EntityUID>> for EntitiesError {
60 fn from(value: transitive_closure::TcError<EntityUID>) -> Self {
61 let tc: TransitiveClosureError = value.into();
62 tc.into()
63 }
64}
65
66#[derive(Debug, Error, Diagnostic)]
67#[error(transparent)]
68#[diagnostic(transparent)]
69pub struct TransitiveClosureError {
72 err: Box<transitive_closure::TcError<EntityUID>>,
73}
74
75#[cfg(test)]
76impl TransitiveClosureError {
77 pub(crate) fn inner(&self) -> &transitive_closure::TcError<EntityUID> {
78 self.err.as_ref()
79 }
80}
81
82impl From<transitive_closure::TcError<EntityUID>> for TransitiveClosureError {
83 fn from(v: transitive_closure::TcError<EntityUID>) -> Self {
84 Self { err: Box::new(v) }
85 }
86}
87
88#[derive(Debug, PartialEq, Eq, Error, Diagnostic)]
89#[error("duplicate entity entry `{}`", .euid)]
90pub struct Duplicate {
92 pub(crate) euid: EntityUID,
94}
95
96#[cfg(test)]
97impl Duplicate {
98 pub(crate) fn euid(&self) -> &EntityUID {
99 &self.euid
100 }
101}
102
103pub type Result<T> = std::result::Result<T, EntitiesError>;
105
106#[derive(Debug, Error, Diagnostic)]
108pub enum InvalidEntityStructureError {
109 #[error("entity `{uid}` has itself as an ancestor")]
111 SelfAncestor {
112 uid: EntityUID,
114 },
115 #[error("entity `{uid}` has `{ancestor}` in both parents and indirect ancestors")]
117 DuplicateAncestor {
118 uid: EntityUID,
120 ancestor: EntityUID,
122 },
123 #[error("action `{uid}` has a non-action parent `{parent}`")]
125 ActionParentIsNotAction {
126 uid: EntityUID,
128 parent: EntityUID,
130 },
131}