Skip to main content

oxihuman_core/
aggregate_root.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5pub struct AggregateRoot {
6    pub id: u64,
7    pub version: u64,
8    pub pending_events: Vec<String>,
9}
10
11pub fn new_aggregate_root(id: u64) -> AggregateRoot {
12    AggregateRoot {
13        id,
14        version: 0,
15        pending_events: Vec::new(),
16    }
17}
18
19pub fn aggregate_apply_event(a: &mut AggregateRoot, event: &str) {
20    a.pending_events.push(event.to_string());
21    a.version += 1;
22}
23
24pub fn aggregate_pending_events(a: &AggregateRoot) -> &[String] {
25    &a.pending_events
26}
27
28pub fn aggregate_clear_events(a: &mut AggregateRoot) {
29    a.pending_events.clear();
30}
31
32pub fn aggregate_version(a: &AggregateRoot) -> u64 {
33    a.version
34}
35
36pub fn aggregate_increment_version(a: &mut AggregateRoot) {
37    a.version += 1;
38}
39
40pub fn aggregate_id(a: &AggregateRoot) -> u64 {
41    a.id
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47
48    #[test]
49    fn test_new_aggregate() {
50        /* new aggregate has version 0 and no events */
51        let a = new_aggregate_root(1);
52        assert_eq!(aggregate_id(&a), 1);
53        assert_eq!(aggregate_version(&a), 0);
54        assert!(aggregate_pending_events(&a).is_empty());
55    }
56
57    #[test]
58    fn test_apply_event() {
59        /* applying event adds to pending and increments version */
60        let mut a = new_aggregate_root(1);
61        aggregate_apply_event(&mut a, "UserCreated");
62        assert_eq!(aggregate_version(&a), 1);
63        assert_eq!(aggregate_pending_events(&a).len(), 1);
64    }
65
66    #[test]
67    fn test_clear_events() {
68        /* clear removes pending events */
69        let mut a = new_aggregate_root(1);
70        aggregate_apply_event(&mut a, "ev1");
71        aggregate_clear_events(&mut a);
72        assert!(aggregate_pending_events(&a).is_empty());
73    }
74
75    #[test]
76    fn test_increment_version() {
77        /* explicit version increment */
78        let mut a = new_aggregate_root(1);
79        aggregate_increment_version(&mut a);
80        assert_eq!(aggregate_version(&a), 1);
81    }
82
83    #[test]
84    fn test_multiple_events() {
85        /* multiple events accumulate */
86        let mut a = new_aggregate_root(2);
87        aggregate_apply_event(&mut a, "ev1");
88        aggregate_apply_event(&mut a, "ev2");
89        aggregate_apply_event(&mut a, "ev3");
90        assert_eq!(aggregate_version(&a), 3);
91        assert_eq!(aggregate_pending_events(&a).len(), 3);
92    }
93
94    #[test]
95    fn test_version_preserved_after_clear() {
96        /* version not reset when events cleared */
97        let mut a = new_aggregate_root(1);
98        aggregate_apply_event(&mut a, "e");
99        aggregate_clear_events(&mut a);
100        assert_eq!(aggregate_version(&a), 1);
101    }
102
103    #[test]
104    fn test_aggregate_id() {
105        /* id stored correctly */
106        let a = new_aggregate_root(42);
107        assert_eq!(aggregate_id(&a), 42);
108    }
109}