core_lib/events/
collector.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use serde::Serialize;
use std::mem;

use crate::events::{Error, Event};

pub trait Publishable: Serialize {
    fn entity_id(&self) -> &str;
    fn topic(&self) -> &str;
}

#[derive(Debug, Clone)]
pub struct Collector {
    events: Vec<Event>,
}

impl Collector {
    pub fn new(events: Vec<Event>) -> Collector {
        Collector { events }
    }

    pub fn create() -> Collector {
        Collector::new(Vec::new())
    }

    pub fn record<P>(&mut self, p: P) -> Result<(), Error>
    where
        P: Publishable,
    {
        let event = Event::create(p.entity_id(), p.topic(), &p)?;

        self.events.push(event);

        Ok(())
    }

    pub fn all(&self) -> &[Event] {
        &self.events
    }

    pub fn drain(&mut self) -> Vec<Event> {
        mem::take(&mut self.events)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[derive(Serialize)]
    struct SomethingHappened {
        name: String,
    }

    impl Publishable for SomethingHappened {
        fn entity_id(&self) -> &str {
            "something-happened#01"
        }

        fn topic(&self) -> &str {
            "something.happened"
        }
    }

    #[test]
    fn get_all_events() {
        let mut collector = Collector::create();

        collector
            .record(SomethingHappened {
                name: "hello".to_string(),
            })
            .unwrap();

        assert_eq!(collector.all().len(), 1);

        let events = collector.drain();
        assert_eq!(events.len(), 1);
        assert_eq!(events[0].entity_id(), "something-happened#01");
        assert_eq!(events[0].topic(), "something.happened");

        assert!(collector.drain().is_empty());
    }
}