zyn 0.5.4

A proc macro framework with templates, composable elements, and built-in diagnostics
Documentation
use zyn::path::{MetaPath, Segment};

#[test]
fn parse_single_key() {
    let path = MetaPath::parse("serde").unwrap();
    assert_eq!(path.len(), 1);
    assert_eq!(path.first().unwrap().as_key(), Some("serde"));
}

#[test]
fn parse_dotted_keys() {
    let path = MetaPath::parse("serde.rename").unwrap();
    assert_eq!(path.len(), 2);

    let segs: Vec<_> = path.segments().iter().collect();
    assert_eq!(segs[0].as_key(), Some("serde"));
    assert_eq!(segs[1].as_key(), Some("rename"));
}

#[test]
fn parse_index() {
    let path = MetaPath::parse("derive[0]").unwrap();
    assert_eq!(path.len(), 2);
    assert_eq!(path.segments()[0].as_key(), Some("derive"));
    assert_eq!(path.segments()[1].as_index(), Some(0));
}

#[test]
fn parse_mixed() {
    let path = MetaPath::parse("a.b[2].c").unwrap();
    assert_eq!(path.len(), 4);
    assert_eq!(path.segments()[0].as_key(), Some("a"));
    assert_eq!(path.segments()[1].as_key(), Some("b"));
    assert_eq!(path.segments()[2].as_index(), Some(2));
    assert_eq!(path.segments()[3].as_key(), Some("c"));
}

#[test]
fn tail_removes_first() {
    let path = MetaPath::parse("a.b.c").unwrap();
    let tail = path.tail();
    assert_eq!(tail.len(), 2);
    assert_eq!(tail.segments()[0].as_key(), Some("b"));
    assert_eq!(tail.segments()[1].as_key(), Some("c"));
}

#[test]
fn display_round_trip() {
    let input = "serde.rename";
    let path = MetaPath::parse(input).unwrap();
    assert_eq!(path.to_string(), input);
}

#[test]
fn display_round_trip_with_index() {
    let input = "derive[0].name";
    let path = MetaPath::parse(input).unwrap();
    assert_eq!(path.to_string(), input);
}

#[test]
fn parse_empty_is_error() {
    assert!(MetaPath::parse("").is_err());
}

#[test]
fn segment_predicates() {
    let key = Segment::from("name");
    assert!(key.is_key());
    assert!(!key.is_index());

    let idx = Segment::from(0usize);
    assert!(idx.is_index());
    assert!(!idx.is_key());
}