use super::ids::{AnchorId, CommitmentId};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalAnchor {
pub id: AnchorId,
pub local_time: LocalTimestamp,
pub causal_deps: Vec<AnchorId>,
pub commitment: Option<CommitmentId>,
}
impl TemporalAnchor {
pub fn now() -> Self {
Self {
id: AnchorId::generate(),
local_time: LocalTimestamp::now(),
causal_deps: Vec::new(),
commitment: None,
}
}
pub fn with_deps(causal_deps: Vec<AnchorId>) -> Self {
Self {
id: AnchorId::generate(),
local_time: LocalTimestamp::now(),
causal_deps,
commitment: None,
}
}
pub fn add_dep(&mut self, dep: AnchorId) {
if !self.causal_deps.contains(&dep) {
self.causal_deps.push(dep);
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub struct LocalTimestamp {
pub sequence: u64,
pub wall_clock: DateTime<Utc>,
}
impl LocalTimestamp {
pub fn now() -> Self {
Self {
sequence: 0, wall_clock: Utc::now(),
}
}
pub fn with_sequence(sequence: u64) -> Self {
Self {
sequence,
wall_clock: Utc::now(),
}
}
}
impl Default for LocalTimestamp {
fn default() -> Self {
Self::now()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TemporalConfig {
pub enable_wall_clock: bool,
pub max_causal_chain_length: usize,
pub enable_causal_verification: bool,
}
impl Default for TemporalConfig {
fn default() -> Self {
Self {
enable_wall_clock: true,
max_causal_chain_length: 1000,
enable_causal_verification: true,
}
}
}