Skip to main content

use_event_metadata/
lib.rs

1#![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}