1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! Error types for core validation contracts.
/// Result alias for Keepsake operations.
pub type Result<T> = core::result::Result<T, KeepsakeError>;
/// Errors returned by the core model contracts.
#[derive(Debug, thiserror::Error, Clone, PartialEq, Eq)]
pub enum KeepsakeError {
/// A caller supplied an empty identifier.
#[error("{field} must not be empty")]
EmptyIdentifier {
/// Field name.
field: &'static str,
},
/// A fulfillment policy cannot be satisfied because its threshold is invalid.
#[error("fulfillment threshold must be positive")]
InvalidFulfillmentThreshold,
/// A command targets a disabled relation.
#[error("relation {relation_id} is disabled")]
RelationDisabled {
/// Disabled relation id.
relation_id: uuid::Uuid,
},
/// A caller tried to apply a relation that is already active for a subject.
#[error("subject {subject_kind}/{subject_id} already has active relation {relation_id}")]
DuplicateActiveKeepsake {
/// Subject kind.
subject_kind: String,
/// Subject id.
subject_id: String,
/// Relation id.
relation_id: uuid::Uuid,
},
/// A flat keepsake record did not satisfy lifecycle invariants.
#[error("invalid keepsake lifecycle: {reason}")]
InvalidKeepsakeLifecycle {
/// Validation failure reason.
reason: &'static str,
},
/// An active relation paired a keepsake with the wrong relation definition.
#[error(
"active relation keepsake uses relation {keepsake_relation_id}, but definition uses {relation_id}"
)]
ActiveRelationMismatch {
/// Relation id stored on the keepsake.
keepsake_relation_id: uuid::Uuid,
/// Relation id stored on the relation definition.
relation_id: uuid::Uuid,
},
/// An active relation was built from a non-active keepsake.
#[error("active relation keepsake {keepsake_id} is not active")]
InactiveActiveRelation {
/// Keepsake id.
keepsake_id: uuid::Uuid,
},
}