use obs_core::{ObsEnvelope, Severity, Tier, observer, self_event};
#[derive(Debug)]
pub struct SelfEventBuilder {
env: ObsEnvelope,
}
impl SelfEventBuilder {
#[must_use]
pub fn new(full_name: &str, tier: Tier, sev: Severity) -> Self {
Self {
env: self_event(full_name, tier, sev),
}
}
#[must_use]
pub fn label(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.env.labels.insert(key.into(), value.into());
self
}
#[must_use]
pub fn labels<I, K, V>(mut self, iter: I) -> Self
where
I: IntoIterator<Item = (K, V)>,
K: Into<String>,
V: Into<String>,
{
for (k, v) in iter {
self.env.labels.insert(k.into(), v.into());
}
self
}
pub fn emit(self) {
observer().emit_envelope(self.env);
}
#[must_use]
pub fn build(self) -> ObsEnvelope {
self.env
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_collect_labels() {
let env = SelfEventBuilder::new("obs.runtime.v1.ObsTest", Tier::Log, Severity::Info)
.label("k1", "v1")
.label("k2", "v2")
.build();
assert_eq!(env.full_name, "obs.runtime.v1.ObsTest");
assert_eq!(env.labels.get("k1"), Some(&"v1".to_string()));
assert_eq!(env.labels.get("k2"), Some(&"v2".to_string()));
}
#[test]
fn test_should_extend_from_iter() {
let env = SelfEventBuilder::new("obs.runtime.v1.ObsTest", Tier::Log, Severity::Info)
.labels([("a", "1"), ("b", "2")])
.build();
assert_eq!(env.labels.get("a"), Some(&"1".to_string()));
assert_eq!(env.labels.get("b"), Some(&"2".to_string()));
}
}