use super::{Evaluate, ExprResult};
use crate::stats::ExprSelector;
use radiate_utils::SmallStr;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MetricField {
LastValue,
Mean,
StdDev,
Min,
Max,
Sum,
Var,
Skew,
Count,
Generation,
UpdateCount,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum MetricKind {
Value,
Duration,
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct SelectExpr {
pub metric: Option<SmallStr>,
pub field: MetricField,
pub kind: MetricKind,
}
impl SelectExpr {
pub fn new(metric: impl Into<SmallStr>) -> Self {
Self {
metric: Some(metric.into()),
field: MetricField::LastValue,
kind: MetricKind::Value,
}
}
pub fn with_field(mut self, field: MetricField) -> Self {
self.field = field;
self
}
pub fn with_kind(mut self, kind: MetricKind) -> Self {
self.kind = kind;
self
}
}
impl<T> Evaluate<T> for SelectExpr
where
T: ExprSelector,
{
fn eval<'a>(&'a mut self, metrics: &T) -> ExprResult<'a> {
Ok(metrics.select(self))
}
}