use super::ids::{CommitmentId, ResonatorId};
use super::temporal::TemporalAnchor;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Commitment {
pub id: CommitmentId,
pub resonator: ResonatorId,
pub content: CommitmentContent,
pub created_at: TemporalAnchor,
pub status: CommitmentStatus,
pub audit_trail: Option<AuditTrail>,
pub risk_assessment: Option<RiskAssessment>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CommitmentContent {
Action {
description: String,
reversible: bool,
},
State {
description: String,
duration: Option<u64>,
},
Boundary { description: String },
Result {
description: String,
deadline: Option<TemporalAnchor>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CommitmentStatus {
Pending,
Active,
Fulfilled,
Violated,
Revoked,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditTrail {
pub events: Vec<AuditEvent>,
pub signature: Option<Vec<u8>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditEvent {
pub timestamp: TemporalAnchor,
pub event_type: AuditEventType,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AuditEventType {
Created,
Activated,
Progress,
Fulfilled,
Violated,
Revoked,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiskAssessment {
pub risk_level: f64,
pub max_impact: Option<MonetaryValue>,
pub mitigations: Vec<String>,
pub requires_approval: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct MonetaryValue {
pub amount: i64,
pub currency: Currency,
}
impl MonetaryValue {
pub fn new(amount: i64) -> Self {
Self {
amount,
currency: Currency::USD,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Currency {
USD,
EUR,
GBP,
JPY,
CNY,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommitmentConfig {
pub require_audit_trail: bool,
pub require_risk_assessment: bool,
pub max_consequence_value: Option<MonetaryValue>,
pub allow_revocation: bool,
pub require_consent_for_revocation: bool,
}
impl Default for CommitmentConfig {
fn default() -> Self {
Self {
require_audit_trail: false,
require_risk_assessment: false,
max_consequence_value: None,
allow_revocation: true,
require_consent_for_revocation: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Consequence {
pub commitment_id: CommitmentId,
pub outcome: ConsequenceOutcome,
pub occurred_at: TemporalAnchor,
pub reversible: bool,
pub reversal: Option<ReversalRecord>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConsequenceOutcome {
Success {
description: String,
impact: Option<String>,
},
Failure {
description: String,
reason: String,
},
Partial {
description: String,
completion_rate: f64,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReversalRecord {
pub reversed_at: TemporalAnchor,
pub reversal_method: String,
pub successful: bool,
}