use facet::Facet;
use facet_testhelpers::test;
use crate::from_str;
#[derive(Facet, Debug, PartialEq)]
#[facet(untagged)]
#[repr(u8)]
pub enum Payload {
Scalar(String),
Seq(Vec<ValueExpr>),
}
#[derive(Facet, Debug, PartialEq)]
#[facet(rename_all = "lowercase")]
#[repr(u8)]
pub enum ValueExpr {
Default,
#[facet(other)]
Other {
#[facet(tag)]
tag: Option<String>,
#[facet(content)]
content: Option<Payload>,
},
}
#[derive(Facet, Debug, PartialEq)]
struct Doc {
v: ValueExpr,
}
#[test]
fn test_bare_scalar_no_hash() {
let input = r#"v name"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("name".into())),
}
);
}
#[test]
fn test_bare_scalar_hash() {
let input = r#"v $name"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("$name".into())),
}
);
}
#[test]
fn test_bare_scalar_quoted() {
let input = r#"v "hello world""#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("hello world".into())),
}
);
}
#[test]
fn test_bare_scalar_number() {
let input = r#"v 123"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("123".into())),
}
);
}
#[test]
fn test_default_tag() {
let input = r#"v @default"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(result.v, ValueExpr::Default);
}
#[test]
fn test_nullary_function() {
let input = r#"v @now"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: Some("now".into()),
content: None,
}
);
}
#[test]
fn test_function_with_args() {
let input = r#"v @coalesce($a $b)"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: Some("coalesce".into()),
content: Some(Payload::Seq(vec![
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("$a".into())),
},
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("$b".into())),
},
])),
}
);
}
#[test]
fn test_nested_function() {
let input = r#"v @lower(@concat($a $b))"#;
let result: Doc = from_str(input).unwrap();
assert_eq!(
result.v,
ValueExpr::Other {
tag: Some("lower".into()),
content: Some(Payload::Seq(vec![ValueExpr::Other {
tag: Some("concat".into()),
content: Some(Payload::Seq(vec![
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("$a".into())),
},
ValueExpr::Other {
tag: None,
content: Some(Payload::Scalar("$b".into())),
},
])),
}])),
}
);
}