use facet::Facet;
use facet_json::{from_str, to_string};
use facet_testhelpers::test;
#[derive(Facet, Debug, PartialEq)]
#[facet(rename_all = "kebab-case")]
#[repr(u8)]
enum FilterValue {
Null,
Gt(Vec<String>),
#[facet(other)]
EqBare(Option<String>),
}
#[test]
fn test_known_variant_works() {
let input = r#"{"gt":["$value"]}"#;
let result: FilterValue = from_str(input).unwrap();
assert_eq!(result, FilterValue::Gt(vec!["$value".to_string()]));
}
#[test]
fn test_unknown_variant_falls_back_to_other() {
let input = r#"{"custom":"$id"}"#;
let result: FilterValue = from_str(input).unwrap();
assert_eq!(result, FilterValue::EqBare(Some("$id".to_string())));
}
#[test]
fn test_other_variant_name_also_falls_back() {
let input = r#"{"eq-bare":"$id"}"#;
let result: FilterValue = from_str(input).unwrap();
assert_eq!(result, FilterValue::EqBare(Some("$id".to_string())));
}
#[test]
fn test_round_trip_other_variant() {
let value = FilterValue::EqBare(Some("$id".to_string()));
let json = to_string(&value).unwrap();
assert_eq!(json, r#""$id""#);
let result: FilterValue = from_str(&json).unwrap();
assert_eq!(result, value);
}
#[test]
fn test_round_trip_known_variant() {
let value = FilterValue::Gt(vec!["$value".to_string()]);
let json = to_string(&value).unwrap();
assert_eq!(json, r#"{"gt":["$value"]}"#);
let result: FilterValue = from_str(&json).unwrap();
assert_eq!(result, value);
}