u-siem 0.7.0

A framework for building custom SIEMs
Documentation
use serde::ser::SerializeStruct;
use serde::Serialize;
use serde::Serializer;
use std::sync::atomic::AtomicI64;
use std::sync::atomic::AtomicU64;
use std::sync::Arc;

#[derive(Debug, Clone)]
struct SummaryMetric {
    pub sum: Arc<AtomicI64>,
    pub count: Arc<AtomicU64>,
    pub multiplier: f64,
    pub quantiles: Vec<Quantile>,
}

impl Serialize for SummaryMetric {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut state = serializer.serialize_struct("SummaryMetric", 4)?;
        state.serialize_field("sum", &(*self.sum))?;
        state.serialize_field("count", &(*self.count))?;
        state.serialize_field("multiplier", &self.multiplier)?;
        state.serialize_field("quantiles", &self.quantiles)?;
        state.end()
    }
}

#[derive(Debug, Clone)]
pub struct Quantile {
    pub tag: &'static str,
    pub quantile: f64,
    pub value: Arc<AtomicU64>,
}

impl Serialize for Quantile {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        let mut state = serializer.serialize_struct("Quantile", 3)?;
        state.serialize_field("tag", &self.tag)?;
        state.serialize_field("value", &(*self.value))?;
        state.serialize_field("quantile", &self.quantile)?;
        state.end()
    }
}