Skip to main content

use_event_envelope/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4use use_event_id::EventId;
5use use_event_kind::EventKind;
6use use_event_metadata::EventMetadata;
7use use_event_name::EventName;
8use use_event_source::EventSource;
9use use_event_target::EventTarget;
10use use_event_timestamp::EventTimestamp;
11
12#[derive(Clone, Debug, Eq, PartialEq)]
13pub struct EventEnvelope<P> {
14    pub id: EventId,
15    pub name: EventName,
16    pub kind: EventKind,
17    pub source: EventSource,
18    pub target: Option<EventTarget>,
19    pub timestamp: EventTimestamp,
20    pub metadata: EventMetadata,
21    pub payload: P,
22}
23
24impl<P> EventEnvelope<P> {
25    pub fn new(name: EventName, kind: EventKind, source: EventSource, payload: P) -> Self {
26        Self {
27            id: EventId::default(),
28            name,
29            kind,
30            source,
31            target: None,
32            timestamp: EventTimestamp::now(),
33            metadata: EventMetadata::default(),
34            payload,
35        }
36    }
37
38    pub fn with_id(mut self, id: impl Into<EventId>) -> Self {
39        self.id = id.into();
40        self
41    }
42
43    pub fn with_target(mut self, target: impl Into<EventTarget>) -> Self {
44        self.target = Some(target.into());
45        self
46    }
47
48    pub fn with_metadata(mut self, metadata: EventMetadata) -> Self {
49        self.metadata = metadata;
50        self
51    }
52
53    pub fn with_timestamp(mut self, timestamp: EventTimestamp) -> Self {
54        self.timestamp = timestamp;
55        self
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::EventEnvelope;
62    use std::time::SystemTime;
63    use use_event_id::EventId;
64    use use_event_kind::EventKind;
65    use use_event_metadata::EventMetadata;
66    use use_event_name::EventName;
67    use use_event_source::EventSource;
68    use use_event_target::EventTarget;
69    use use_event_timestamp::EventTimestamp;
70
71    #[test]
72    fn creates_default_envelope() {
73        let event = EventEnvelope::new(
74            EventName::new("command.started"),
75            EventKind::Started,
76            EventSource::new("cli"),
77            "rustuse build",
78        );
79
80        assert_eq!(event.id, EventId::default());
81        assert_eq!(event.name.as_str(), "command.started");
82        assert_eq!(event.kind, EventKind::Started);
83        assert_eq!(event.source.as_str(), "cli");
84        assert_eq!(event.target, None);
85        assert_eq!(event.payload, "rustuse build");
86    }
87
88    #[test]
89    fn applies_builder_values() {
90        let metadata = EventMetadata::with_entry("trace_id", "abc");
91        let timestamp = EventTimestamp::from_system_time(SystemTime::UNIX_EPOCH);
92        let event = EventEnvelope::new(
93            EventName::new("command.started"),
94            EventKind::Started,
95            EventSource::new("cli"),
96            "rustuse build",
97        )
98        .with_id("evt-001")
99        .with_target(EventTarget::new("worker"))
100        .with_metadata(metadata)
101        .with_timestamp(timestamp);
102
103        assert_eq!(event.id.as_str(), "evt-001");
104        assert_eq!(
105            event.target.as_ref().map(EventTarget::as_str),
106            Some("worker")
107        );
108        assert_eq!(event.metadata.get("trace_id"), Some("abc"));
109        assert_eq!(event.timestamp.as_system_time(), SystemTime::UNIX_EPOCH);
110    }
111}