use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case", tag = "kind")]
#[non_exhaustive]
pub enum NarrowingStrategy {
Truncate,
Delete,
SetToValue {
value: String,
},
}
impl NarrowingStrategy {
#[must_use]
pub fn kind_label(&self) -> &'static str {
match self {
NarrowingStrategy::Truncate => "truncate",
NarrowingStrategy::Delete => "delete",
NarrowingStrategy::SetToValue { .. } => "set_to_value",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn truncate_roundtrips_through_json_with_kind_tag() {
let s = NarrowingStrategy::Truncate;
let json = serde_json::to_string(&s).unwrap();
assert_eq!(json, r#"{"kind":"truncate"}"#);
let back: NarrowingStrategy = serde_json::from_str(&json).unwrap();
assert_eq!(back, s);
}
#[test]
fn delete_roundtrips_through_json_with_kind_tag() {
let s = NarrowingStrategy::Delete;
let json = serde_json::to_string(&s).unwrap();
assert_eq!(json, r#"{"kind":"delete"}"#);
let back: NarrowingStrategy = serde_json::from_str(&json).unwrap();
assert_eq!(back, s);
}
#[test]
fn set_to_value_roundtrips_with_value_field() {
let s = NarrowingStrategy::SetToValue {
value: "'TRUNCATED'".into(),
};
let json = serde_json::to_string(&s).unwrap();
assert_eq!(json, r#"{"kind":"set_to_value","value":"'TRUNCATED'"}"#);
let back: NarrowingStrategy = serde_json::from_str(&json).unwrap();
assert_eq!(back, s);
}
#[test]
fn kind_label_returns_snake_case_tag() {
assert_eq!(NarrowingStrategy::Truncate.kind_label(), "truncate");
assert_eq!(NarrowingStrategy::Delete.kind_label(), "delete");
assert_eq!(
NarrowingStrategy::SetToValue { value: "0".into() }.kind_label(),
"set_to_value"
);
}
}