leptos_sync_core/crdt/
mod.rs

1//! Conflict-free Replicated Data Types (CRDTs) for distributed systems
2//! 
3//! This module provides various CRDT implementations that can be used
4//! to build eventually consistent distributed applications.
5
6mod crdt_basic;
7pub mod list;
8pub mod tree;
9pub mod graph;
10
11// Re-export basic CRDTs
12pub use crdt_basic::{LwwRegister, LwwMap, GCounter, ReplicaId, Mergeable, CRDT};
13
14pub use list::{
15    ElementId, ElementMetadata, ListElement, ListStrategy, ListConfig,
16    AddWinsList, RemoveWinsList, LwwList,
17};
18
19pub use tree::{
20    NodeId, NodeMetadata, TreeNode, TreeStrategy, TreeConfig,
21    AddWinsTree, RemoveWinsTree,
22};
23
24pub use graph::{
25    VertexId, EdgeId, VertexMetadata, EdgeMetadata, Vertex, Edge,
26    GraphStrategy, GraphConfig, AddWinsGraph, RemoveWinsGraph,
27};
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::crdt::ReplicaId;
33    use uuid::Uuid;
34
35    fn create_replica(id: u64) -> ReplicaId {
36        ReplicaId::from(Uuid::from_u64_pair(0, id))
37    }
38
39    #[test]
40    fn test_list_crdt_integration() {
41        let replica = create_replica(1);
42        let mut list = AddWinsList::new(replica);
43        
44        let id1 = list.add("item1", 1000);
45        let id2 = list.add("item2", 2000);
46        
47        assert_eq!(list.len(), 2);
48        assert!(list.contains(&id1));
49        assert!(list.contains(&id2));
50    }
51
52    #[test]
53    fn test_tree_crdt_integration() {
54        let replica = create_replica(1);
55        let mut tree = AddWinsTree::new(replica);
56        
57        let root_id = tree.add_root("root", 1000);
58        let child_id = tree.add_child(&root_id, "child", 2000).unwrap();
59        
60        assert_eq!(tree.len(), 2);
61        assert!(tree.contains(&root_id));
62        assert!(tree.contains(&child_id));
63    }
64
65    #[test]
66    fn test_graph_crdt_integration() {
67        let replica = create_replica(1);
68        let mut graph = AddWinsGraph::new(replica);
69        
70        let v1_id = graph.add_vertex("vertex1", 1000);
71        let v2_id = graph.add_vertex("vertex2", 2000);
72        let edge_id = graph.add_edge(&v1_id, &v2_id, 3000, None).unwrap();
73        
74        assert_eq!(graph.vertex_count(), 2);
75        assert_eq!(graph.edge_count(), 1);
76        assert!(graph.contains_vertex(&v1_id));
77        assert!(graph.contains_edge(&edge_id));
78    }
79
80    #[test]
81    fn test_crdt_traits() {
82        let replica = create_replica(1);
83        
84        // Test that all CRDT types implement the required traits
85        let list: AddWinsList<String> = AddWinsList::new(replica);
86        let tree: AddWinsTree<String> = AddWinsTree::new(replica);
87        let graph: AddWinsGraph<String> = AddWinsGraph::new(replica);
88        
89        // This should compile if all types implement CRDT trait
90        let _: &dyn CRDT = &list;
91        let _: &dyn CRDT = &tree;
92        let _: &dyn CRDT = &graph;
93    }
94}