use_event_metadata/
lib.rs1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct EventMetadataEntry {
6 key: String,
7 value: String,
8}
9
10impl EventMetadataEntry {
11 pub fn new(key: impl Into<String>, value: impl Into<String>) -> Self {
12 Self {
13 key: key.into(),
14 value: value.into(),
15 }
16 }
17
18 pub fn key(&self) -> &str {
19 &self.key
20 }
21
22 pub fn value(&self) -> &str {
23 &self.value
24 }
25}
26
27#[derive(Clone, Debug, Default, Eq, PartialEq)]
28pub struct EventMetadata {
29 entries: Vec<EventMetadataEntry>,
30}
31
32impl EventMetadata {
33 pub const fn new() -> Self {
34 Self {
35 entries: Vec::new(),
36 }
37 }
38
39 pub fn with_entry(key: impl Into<String>, value: impl Into<String>) -> Self {
40 let mut metadata = Self::new();
41 metadata.insert(key, value);
42 metadata
43 }
44
45 pub fn insert(&mut self, key: impl Into<String>, value: impl Into<String>) {
46 let key = key.into();
47 if let Some(entry) = self.entries.iter_mut().find(|entry| entry.key == key) {
48 entry.value = value.into();
49 } else {
50 self.entries.push(EventMetadataEntry::new(key, value));
51 }
52 }
53
54 pub fn get(&self, key: &str) -> Option<&str> {
55 self.entries
56 .iter()
57 .find(|entry| entry.key == key)
58 .map(EventMetadataEntry::value)
59 }
60
61 pub fn entries(&self) -> &[EventMetadataEntry] {
62 &self.entries
63 }
64
65 pub fn is_empty(&self) -> bool {
66 self.entries.is_empty()
67 }
68
69 pub fn len(&self) -> usize {
70 self.entries.len()
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::{EventMetadata, EventMetadataEntry};
77
78 #[test]
79 fn stores_entry_accessors() {
80 let entry = EventMetadataEntry::new("trace_id", "abc");
81
82 assert_eq!(entry.key(), "trace_id");
83 assert_eq!(entry.value(), "abc");
84 }
85
86 #[test]
87 fn inserts_and_updates_entries() {
88 let mut metadata = EventMetadata::with_entry("trace_id", "abc");
89
90 metadata.insert("trace_id", "def");
91 metadata.insert("source", "cli");
92
93 assert_eq!(metadata.get("trace_id"), Some("def"));
94 assert_eq!(metadata.get("source"), Some("cli"));
95 assert_eq!(metadata.len(), 2);
96 }
97
98 #[test]
99 fn exposes_entries_in_order() {
100 let mut metadata = EventMetadata::new();
101 metadata.insert("a", "1");
102 metadata.insert("b", "2");
103
104 assert_eq!(metadata.entries()[0].key(), "a");
105 assert_eq!(metadata.entries()[1].key(), "b");
106 }
107}