multilinear-parser 0.5.3

A parser for the multilinear story systems
Documentation
#![allow(clippy::unwrap_used, clippy::expect_used)]

use multilinear_parser::parse_multilinear;

fn event_names(source: &str) -> Vec<String> {
    let info = parse_multilinear(source.as_bytes()).expect("source should parse");
    let mut names: Vec<String> = info.events.iter().map(|(_, path)| path.join(" ")).collect();
    names.sort();
    names
}

#[test]
fn namespace_parent_is_not_an_event() {
    let names = event_names(
        "mood: calm\n\
         \n\
         # Chapter\n\
         \n\
         ## Intro\n\
         \n\
         mood: calm > tense\n\
         \n\
         ## Fight\n\
         \n\
         mood: tense\n\
         \n\
         # Epilogue\n\
         \n\
         mood: tense > calm\n",
    );

    assert_eq!(names, ["Chapter Fight", "Chapter Intro", "Epilogue"]);
}

#[test]
fn namespace_parent_with_conditions_is_an_event() {
    let names = event_names(
        "mood: calm\n\
         \n\
         # Chapter\n\
         \n\
         mood: calm > tense\n\
         \n\
         ## Intro\n\
         \n\
         mood: tense\n",
    );

    assert_eq!(names, ["Chapter", "Chapter Intro"]);
}

#[test]
fn lonely_header_stays_an_event() {
    let names = event_names(
        "mood: calm\n\
         \n\
         # Lonely\n\
         \n\
         # Epilogue\n\
         \n\
         mood: calm\n",
    );

    assert_eq!(names, ["Epilogue", "Lonely"]);
}