zyn 0.5.4

A proc macro framework with templates, composable elements, and built-in diagnostics
Documentation
#[derive(zyn::Attribute)]
enum Mode {
    Fast,
    Slow,
    Custom { speed: i64 },
}

#[test]
fn unit_variant_from_flag() {
    let arg: zyn::meta::Arg = zyn::parse!("fast").unwrap();
    assert!(matches!(Mode::from_arg(&arg).unwrap(), Mode::Fast));
}

#[test]
fn unit_variant_slow_from_flag() {
    let arg: zyn::meta::Arg = zyn::parse!("slow").unwrap();
    assert!(matches!(Mode::from_arg(&arg).unwrap(), Mode::Slow));
}

#[test]
fn struct_variant_from_list() {
    let arg: zyn::meta::Arg = zyn::parse!("custom(speed = 42)").unwrap();
    let v = Mode::from_arg(&arg).unwrap();
    assert!(matches!(v, Mode::Custom { speed: 42 }));
}

#[test]
fn unknown_variant_is_err() {
    let arg: zyn::meta::Arg = zyn::parse!("turbo").unwrap();
    assert!(Mode::from_arg(&arg).is_err());
}

#[test]
fn wrong_arg_shape_is_err() {
    let arg: zyn::meta::Arg = zyn::parse!("x = 1").unwrap();
    assert!(Mode::from_arg(&arg).is_err());
}

#[derive(zyn::Attribute)]
enum Color {
    Red,
    Named(String),
    Rgb(u8, u8, u8),
}

#[test]
fn single_field_tuple_from_expr() {
    let arg: zyn::meta::Arg = zyn::parse!("named = \"blue\"").unwrap();
    let v = Color::from_arg(&arg).unwrap();
    assert!(matches!(v, Color::Named(s) if s == "blue"));
}

#[test]
fn multi_field_tuple_from_list() {
    let arg: zyn::meta::Arg = zyn::parse!("rgb(255, 128, 0)").unwrap();
    let v = Color::from_arg(&arg).unwrap();
    assert!(matches!(v, Color::Rgb(255, 128, 0)));
}

#[test]
fn unit_color_from_flag() {
    let arg: zyn::meta::Arg = zyn::parse!("red").unwrap();
    assert!(matches!(Color::from_arg(&arg).unwrap(), Color::Red));
}

#[derive(zyn::Attribute)]
#[zyn("config")]
struct Config {
    mode: Mode,
}

#[test]
fn enum_as_field_in_attribute_struct() {
    let args: zyn::meta::Args = zyn::parse!("mode(fast)").unwrap();
    let config = Config::from_args(&args).unwrap();
    assert!(matches!(config.mode, Mode::Fast));
}