use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[derive(Default)]
pub enum Confidence {
#[default]
Extracted,
Inferred,
Ambiguous,
}
impl Confidence {
pub fn default_score(&self) -> f64 {
match self {
Confidence::Extracted => 1.0,
Confidence::Inferred => 0.7,
Confidence::Ambiguous => 0.4,
}
}
}
impl std::fmt::Display for Confidence {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Confidence::Extracted => write!(f, "Extracted"),
Confidence::Inferred => write!(f, "Inferred"),
Confidence::Ambiguous => write!(f, "Ambiguous"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialize_to_screaming_snake() {
assert_eq!(
serde_json::to_string(&Confidence::Extracted).unwrap(),
r#""EXTRACTED""#
);
assert_eq!(
serde_json::to_string(&Confidence::Inferred).unwrap(),
r#""INFERRED""#
);
assert_eq!(
serde_json::to_string(&Confidence::Ambiguous).unwrap(),
r#""AMBIGUOUS""#
);
}
#[test]
fn deserialize_from_screaming_snake() {
let c: Confidence = serde_json::from_str(r#""INFERRED""#).unwrap();
assert_eq!(c, Confidence::Inferred);
}
#[test]
fn default_scores() {
assert!((Confidence::Extracted.default_score() - 1.0).abs() < f64::EPSILON);
assert!((Confidence::Inferred.default_score() - 0.7).abs() < f64::EPSILON);
assert!((Confidence::Ambiguous.default_score() - 0.4).abs() < f64::EPSILON);
}
#[test]
fn default_is_extracted() {
assert_eq!(Confidence::default(), Confidence::Extracted);
}
}