1use serde::{Deserialize, Serialize};
4use super::ids::{CommitmentId, ResonatorId};
5use super::temporal::TemporalAnchor;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Commitment {
12 pub id: CommitmentId,
13 pub resonator: ResonatorId,
14
15 pub content: CommitmentContent,
17
18 pub created_at: TemporalAnchor,
20
21 pub status: CommitmentStatus,
23
24 pub audit_trail: Option<AuditTrail>,
26
27 pub risk_assessment: Option<RiskAssessment>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub enum CommitmentContent {
34 Action {
36 description: String,
37 reversible: bool,
38 },
39
40 State {
42 description: String,
43 duration: Option<u64>,
44 },
45
46 Boundary {
48 description: String,
49 },
50
51 Result {
53 description: String,
54 deadline: Option<TemporalAnchor>,
55 },
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
60pub enum CommitmentStatus {
61 Pending,
63
64 Active,
66
67 Fulfilled,
69
70 Violated,
72
73 Revoked,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct AuditTrail {
80 pub events: Vec<AuditEvent>,
82
83 pub signature: Option<Vec<u8>>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct AuditEvent {
90 pub timestamp: TemporalAnchor,
91 pub event_type: AuditEventType,
92 pub description: String,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub enum AuditEventType {
97 Created,
98 Activated,
99 Progress,
100 Fulfilled,
101 Violated,
102 Revoked,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct RiskAssessment {
108 pub risk_level: f64,
110
111 pub max_impact: Option<MonetaryValue>,
113
114 pub mitigations: Vec<String>,
116
117 pub requires_approval: bool,
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
123pub struct MonetaryValue {
124 pub amount: i64,
126
127 pub currency: Currency,
129}
130
131impl MonetaryValue {
132 pub fn new(amount: i64) -> Self {
133 Self {
134 amount,
135 currency: Currency::USD,
136 }
137 }
138}
139
140#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
141pub enum Currency {
142 USD,
143 EUR,
144 GBP,
145 JPY,
146 CNY,
147}
148
149#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct CommitmentConfig {
152 pub require_audit_trail: bool,
154
155 pub require_risk_assessment: bool,
157
158 pub max_consequence_value: Option<MonetaryValue>,
160
161 pub allow_revocation: bool,
163
164 pub require_consent_for_revocation: bool,
166}
167
168impl Default for CommitmentConfig {
169 fn default() -> Self {
170 Self {
171 require_audit_trail: false,
172 require_risk_assessment: false,
173 max_consequence_value: None,
174 allow_revocation: true,
175 require_consent_for_revocation: true,
176 }
177 }
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct Consequence {
183 pub commitment_id: CommitmentId,
185
186 pub outcome: ConsequenceOutcome,
188
189 pub occurred_at: TemporalAnchor,
191
192 pub reversible: bool,
194
195 pub reversal: Option<ReversalRecord>,
197}
198
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub enum ConsequenceOutcome {
201 Success {
202 description: String,
203 impact: Option<String>,
204 },
205 Failure {
206 description: String,
207 reason: String,
208 },
209 Partial {
210 description: String,
211 completion_rate: f64,
212 },
213}
214
215#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct ReversalRecord {
217 pub reversed_at: TemporalAnchor,
218 pub reversal_method: String,
219 pub successful: bool,
220}