use crate::disposition::Disposition;
use crate::identity::{AgentId, ClaimRef};
use crate::time::TransactionTime;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct LedgerEntry {
pub entry_id: uuid::Uuid,
pub agent_id: AgentId,
pub claim_ref: ClaimRef,
pub event_kind: LedgerEventKind,
pub disposition: Disposition,
pub rationale: Option<serde_json::Value>,
pub recorded_at: TransactionTime,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum LedgerEventKind {
ClaimCommitted,
ValidityAsserted,
AdjudicationRequested,
AdjudicationResolved,
RecallReEntryDetected,
Quarantined,
DependentFlaggedPendingReview,
ServedAsInjected,
AdjudicationExpired,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::disposition::Disposition;
use crate::identity::AgentId;
use chrono::Utc;
fn make_entry(kind: LedgerEventKind) -> LedgerEntry {
LedgerEntry {
entry_id: uuid::Uuid::new_v4(),
agent_id: AgentId("agent-1".into()),
claim_ref: ClaimRef::new_random(),
event_kind: kind,
disposition: Disposition::CommittedCheap,
rationale: None,
recorded_at: TransactionTime(Utc::now()),
}
}
#[test]
fn served_as_injected_event_is_present() {
let e = make_entry(LedgerEventKind::ServedAsInjected);
assert_eq!(e.event_kind, LedgerEventKind::ServedAsInjected);
}
#[test]
fn dependent_flagged_pending_review_event_is_present() {
let e = make_entry(LedgerEventKind::DependentFlaggedPendingReview);
assert_eq!(e.event_kind, LedgerEventKind::DependentFlaggedPendingReview);
}
#[test]
fn all_event_kinds_round_trip_serde() {
let kinds = [
LedgerEventKind::ClaimCommitted,
LedgerEventKind::ValidityAsserted,
LedgerEventKind::AdjudicationRequested,
LedgerEventKind::AdjudicationResolved,
LedgerEventKind::RecallReEntryDetected,
LedgerEventKind::Quarantined,
LedgerEventKind::DependentFlaggedPendingReview,
LedgerEventKind::ServedAsInjected,
LedgerEventKind::AdjudicationExpired,
];
for k in &kinds {
let json = serde_json::to_string(k).unwrap();
let back: LedgerEventKind = serde_json::from_str(&json).unwrap();
assert_eq!(k, &back);
}
}
#[test]
fn ledger_entry_round_trip_serde() {
let e = make_entry(LedgerEventKind::ClaimCommitted);
let json = serde_json::to_string(&e).unwrap();
let back: LedgerEntry = serde_json::from_str(&json).unwrap();
assert_eq!(e.entry_id, back.entry_id);
assert_eq!(e.event_kind, back.event_kind);
assert_eq!(e.disposition, back.disposition);
}
}