use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct Measured<T> {
pub value: T,
pub source: Source,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Source {
Server,
Tokenizer,
Proxy,
Estimate,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialises_value_and_source() {
let m = Measured {
value: 1234u32,
source: Source::Server,
};
assert_eq!(
serde_json::to_string(&m).unwrap(),
r#"{"value":1234,"source":"server"}"#
);
}
#[test]
fn unmeasured_is_null() {
let m: Option<Measured<u32>> = None;
assert_eq!(serde_json::to_string(&m).unwrap(), "null");
}
#[test]
fn sources_order_from_strongest_to_weakest() {
assert!(Source::Server < Source::Tokenizer);
assert!(Source::Tokenizer < Source::Proxy);
assert!(Source::Proxy < Source::Estimate);
}
}