use std::collections::HashMap;
use std::collections::{BTreeMap};
use std::time::SystemTime;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SyncMode {
Strong,
Eventual,
Causal,
}
impl Default for SyncMode {
fn default() -> Self {
Self::Eventual
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ConflictResolution {
LastWriterWins,
FirstWriterWins,
CustomMerge,
VectorClock,
}
impl Default for ConflictResolution {
fn default() -> Self {
Self::LastWriterWins
}
}
#[derive(Debug, Clone)]
pub struct SyncConfig {
pub mode: SyncMode,
pub conflict_resolution: ConflictResolution,
pub sync_interval_ms: u64,
pub max_latency_ms: u64,
}
impl Default for SyncConfig {
fn default() -> Self {
Self {
mode: SyncMode::Eventual,
conflict_resolution: ConflictResolution::LastWriterWins,
sync_interval_ms: 100,
max_latency_ms: 1000,
}
}
}
#[derive(Debug, Clone)]
pub struct StateChange {
pub key: String,
pub value: serde_json::Value,
pub timestamp: SystemTime,
pub version: u64,
}
pub struct StateSync {
config: SyncConfig,
state: HashMap<String, StateChange>,
version_counter: u64,
}
impl StateSync {
pub fn new(config: SyncConfig) -> Result<Self, SyncError> {
Ok(Self {
config,
state: HashMap::new(),
version_counter: 0,
})
}
pub fn publish_change(&mut self, change: StateChange) -> Result<(), SyncError> {
self.version_counter += 1;
self.state.insert(change.key.clone(), change);
Ok(())
}
pub fn get_state(&self, key: &str) -> Option<&StateChange> {
self.state.get(key)
}
pub fn sync_with_region(&self, _region: &str) -> Result<(), SyncError> {
Ok(())
}
pub fn state_count(&self) -> usize {
self.state.len()
}
pub fn current_version(&self) -> u64 {
self.version_counter
}
}
#[derive(Debug, Clone)]
pub enum SyncError {
InitializationFailed(String),
SyncFailed(String),
Conflict(String),
Timeout,
}
impl std::fmt::Display for SyncError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InitializationFailed(msg) => write!(f, "初始化失败: {}", msg),
Self::SyncFailed(msg) => write!(f, "同步失败: {}", msg),
Self::Conflict(msg) => write!(f, "冲突: {}", msg),
Self::Timeout => write!(f, "超时"),
}
}
}
impl std::error::Error for SyncError {}