1use super::ids::{CommitmentId, ResonatorId};
4use super::temporal::TemporalAnchor;
5use serde::{Deserialize, Serialize};
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 { description: String },
48
49 Result {
51 description: String,
52 deadline: Option<TemporalAnchor>,
53 },
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
58pub enum CommitmentStatus {
59 Pending,
61
62 Active,
64
65 Fulfilled,
67
68 Violated,
70
71 Revoked,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct AuditTrail {
78 pub events: Vec<AuditEvent>,
80
81 pub signature: Option<Vec<u8>>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct AuditEvent {
88 pub timestamp: TemporalAnchor,
89 pub event_type: AuditEventType,
90 pub description: String,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub enum AuditEventType {
95 Created,
96 Activated,
97 Progress,
98 Fulfilled,
99 Violated,
100 Revoked,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct RiskAssessment {
106 pub risk_level: f64,
108
109 pub max_impact: Option<MonetaryValue>,
111
112 pub mitigations: Vec<String>,
114
115 pub requires_approval: bool,
117}
118
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
121pub struct MonetaryValue {
122 pub amount: i64,
124
125 pub currency: Currency,
127}
128
129impl MonetaryValue {
130 pub fn new(amount: i64) -> Self {
131 Self {
132 amount,
133 currency: Currency::USD,
134 }
135 }
136}
137
138#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
139pub enum Currency {
140 USD,
141 EUR,
142 GBP,
143 JPY,
144 CNY,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize)]
149pub struct CommitmentConfig {
150 pub require_audit_trail: bool,
152
153 pub require_risk_assessment: bool,
155
156 pub max_consequence_value: Option<MonetaryValue>,
158
159 pub allow_revocation: bool,
161
162 pub require_consent_for_revocation: bool,
164}
165
166impl Default for CommitmentConfig {
167 fn default() -> Self {
168 Self {
169 require_audit_trail: false,
170 require_risk_assessment: false,
171 max_consequence_value: None,
172 allow_revocation: true,
173 require_consent_for_revocation: true,
174 }
175 }
176}
177
178#[derive(Debug, Clone, Serialize, Deserialize)]
180pub struct Consequence {
181 pub commitment_id: CommitmentId,
183
184 pub outcome: ConsequenceOutcome,
186
187 pub occurred_at: TemporalAnchor,
189
190 pub reversible: bool,
192
193 pub reversal: Option<ReversalRecord>,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
198pub enum ConsequenceOutcome {
199 Success {
200 description: String,
201 impact: Option<String>,
202 },
203 Failure {
204 description: String,
205 reason: String,
206 },
207 Partial {
208 description: String,
209 completion_rate: f64,
210 },
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct ReversalRecord {
215 pub reversed_at: TemporalAnchor,
216 pub reversal_method: String,
217 pub successful: bool,
218}