use_event_envelope/
lib.rs1#![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}