use std::ops::Sub;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Default, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MetricDelta<T>
where
T: Sub,
{
#[serde(skip_serializing_if = "Option::is_none")]
pub current: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub baseline: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change: Option<T>,
}
impl<T> MetricDelta<T>
where
T: Copy + Sub<Output = T>,
{
pub fn new(current: Option<T>, baseline: Option<T>) -> Self {
Self {
current,
baseline,
change: current.zip(baseline).map(|(c, b)| c - b),
}
}
}