use crate::claim::{Confidence, Criticality, Fact};
use crate::identity::ClaimRef;
use crate::provenance::ProvenanceLabel;
use crate::time::{TransactionTime, ValidTime};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct BeliefProjection {
pub status: BeliefStatus,
pub primary: Option<Belief>,
pub alternatives: Vec<Belief>,
pub currency: CurrencyState,
pub criticality: Criticality,
pub staleness: StalenessFlag,
pub markers: Vec<Marker>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum BeliefStatus {
Resolved,
Contested,
Conflict,
TimingUncertain,
NoBelief,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Belief {
pub claim_ref: ClaimRef,
pub fact: Fact,
pub provenance: ProvenanceLabel,
pub valid_time: ValidTime,
pub transaction_time: TransactionTime,
pub confidence: Confidence,
pub currency_signal: CurrencySignal,
pub criticality: Criticality,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum CurrencyState {
Fresh,
AgingUnconfirmed,
Decayed,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CurrencySignal {
pub last_refreshed_at: TransactionTime,
pub state: CurrencyState,
pub corroboration_count: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct StalenessFlag {
pub is_stale: bool,
pub reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum Marker {
Contested,
PendingConflict,
PendingReview,
AgedSetMember,
RecallTainted,
LowDerivationAnchor,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "PascalCase")]
pub enum HistoryEntryStatus {
Current,
Superseded,
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::Utc;
#[test]
fn belief_status_round_trip_serde() {
let statuses = [
BeliefStatus::Resolved,
BeliefStatus::Contested,
BeliefStatus::Conflict,
BeliefStatus::TimingUncertain,
BeliefStatus::NoBelief,
];
for s in &statuses {
let json = serde_json::to_string(s).unwrap();
let back: BeliefStatus = serde_json::from_str(&json).unwrap();
assert_eq!(s, &back);
}
}
#[test]
fn currency_state_round_trip_serde() {
let states = [CurrencyState::Fresh, CurrencyState::AgingUnconfirmed, CurrencyState::Decayed];
for s in &states {
let json = serde_json::to_string(s).unwrap();
let back: CurrencyState = serde_json::from_str(&json).unwrap();
assert_eq!(s, &back);
}
}
#[test]
fn staleness_flag_not_stale() {
let f = StalenessFlag { is_stale: false, reason: None };
assert!(!f.is_stale);
assert!(f.reason.is_none());
}
#[test]
fn marker_round_trip_serde() {
let marker = Marker::RecallTainted;
let json = serde_json::to_string(&marker).unwrap();
let back: Marker = serde_json::from_str(&json).unwrap();
assert_eq!(marker, back);
}
#[test]
fn currency_signal_round_trip_serde() {
let sig = CurrencySignal {
last_refreshed_at: TransactionTime(Utc::now()),
state: CurrencyState::Fresh,
corroboration_count: 3,
};
let json = serde_json::to_string(&sig).unwrap();
let back: CurrencySignal = serde_json::from_str(&json).unwrap();
assert_eq!(sig.corroboration_count, back.corroboration_count);
assert_eq!(sig.state, back.state);
}
}