saluki_core/data_model/payload/
metadata.rs

1use std::any::Any;
2
3use anymap3::{CloneAny, Map};
4
5/// Payload metadata.
6///
7/// Contains the event count and an extensible map of typed metadata values.
8/// Components can store and retrieve arbitrary typed data using the `set` and `get` methods.
9#[derive(Clone)]
10pub struct PayloadMetadata {
11    event_count: usize,
12    data_point_count: usize,
13    extensions: Map<dyn CloneAny + Send + Sync>,
14}
15
16impl PayloadMetadata {
17    /// Creates a new `PayloadMetadata` with the given event count.
18    pub fn from_event_count(event_count: usize) -> Self {
19        PayloadMetadata {
20            event_count,
21            data_point_count: 0,
22            extensions: Map::new(),
23        }
24    }
25
26    /// Creates a new `PayloadMetadata` with the given event and data point counts.
27    pub fn from_event_and_data_point_count(event_count: usize, data_point_count: usize) -> Self {
28        PayloadMetadata {
29            event_count,
30            data_point_count,
31            extensions: Map::new(),
32        }
33    }
34
35    /// Returns the number of events in the payload.
36    pub fn event_count(&self) -> usize {
37        self.event_count
38    }
39
40    /// Returns the number of metric data points in the payload.
41    pub fn data_point_count(&self) -> usize {
42        self.data_point_count
43    }
44
45    /// Gets a reference to a typed extension value, if present.
46    pub fn get<T: Any + Clone + Send + Sync>(&self) -> Option<&T> {
47        self.extensions.get::<T>()
48    }
49
50    /// Sets a typed extension value, returning `self` for chaining.
51    pub fn with<T: Any + Clone + Send + Sync>(mut self, value: T) -> Self {
52        self.extensions.insert(value);
53        self
54    }
55
56    /// Sets a typed extension value in place.
57    pub fn set<T: Any + Clone + Send + Sync>(&mut self, value: T) {
58        self.extensions.insert(value);
59    }
60}