efx-core 1.1.1

Core parser and AST for EFx proc-macro
Documentation
use efx_core::{parse_str, Node, Text};

#[test]
fn text_only() {
    let ast = parse_str("Hello {{world}}!").unwrap();
    assert!(matches!(
        &ast[0],
        Node::Text(Text { value, .. }) if value == "Hello {world}!"
    ));
}

#[test]
fn element_nested_interp() {
    let src = "<Row><Label>Hello {name}</Label><Separator/></Row>";
    let ast = parse_str(src).unwrap();
    match &ast[0] {
        Node::Element(el) => {
            assert_eq!(el.name, "Row");
            assert_eq!(el.children.len(), 2);
        }
        _ => panic!("expected root element"),
    }
}

#[test]
fn mismatched_tag() {
    let err = parse_str("<A>oops</B>").unwrap_err();
    assert!(err.msg.contains("unmatched closing tag"));
}

#[test]
fn self_closed() {
    let ast = parse_str("<Separator/><Separator/>").unwrap();
    assert_eq!(ast.len(), 2);
}

#[test]
fn element_with_attrs() {
    let src = r#"<Label color="red" size="14">Hi</Label>"#;
    let ast = parse_str(src).unwrap();
    match &ast[0] {
        Node::Element(el) => {
            assert_eq!(el.name, "Label");
            assert_eq!(el.children.len(), 1);
            assert_eq!(el.attrs.len(), 2);
            assert_eq!(el.attrs[0].name, "color");
            assert_eq!(el.attrs[0].value, "red");
            assert_eq!(el.attrs[1].name, "size");
            assert_eq!(el.attrs[1].value, "14");
        }
        _ => panic!("expected element"),
    }
}

#[test]
fn self_closed_with_attrs() {
    let src = r#"<Separator class="thin"/>"#;
    let ast = parse_str(src).unwrap();
    match &ast[0] {
        Node::Element(el) => {
            assert_eq!(el.name, "Separator");
            assert!(el.children.is_empty());
            assert_eq!(el.attrs.len(), 1);
            assert_eq!(el.attrs[0].name, "class");
            assert_eq!(el.attrs[0].value, "thin");
        }
        _ => panic!("expected element"),
    }
}