bard 2.0.1

Creates PDF and HTML songbooks out of easy-to-write Markdown sources.
Documentation
use std::collections::HashMap;

mod util_ng;
pub use util_ng::*;

fn prepare_project(name: &str, postprocess: bool) -> TestProject {
    TestProject::new(name)
        .postprocess(postprocess)
        .output("songbook.html")
        .script(
            ".html",
            "script",
            indoc! {r#"
            #!/bin/sh

            echo "BARD = \"${BARD}\"
            OUTPUT = \"${OUTPUT}\"
            PROJECT_DIR = \"${PROJECT_DIR}\"
            OUTPUT_DIR = \"${OUTPUT_DIR}\"
            " > "${OUTPUT_STEM}.toml"

            "#},
            indoc! {r#"
            @ECHO OFF

            rem Windows paths contain backslashes - we need to be escape them for JSON:
            set BARD=%BARD:\=\\%
            set OUTPUT=%OUTPUT:\=\\%
            set PROJECT_DIR=%PROJECT_DIR:\=\\%
            set OUTPUT_DIR=%OUTPUT_DIR:\=\\%

            (
            echo BARD = "%BARD%"
            echo OUTPUT = "%OUTPUT%"
            echo PROJECT_DIR = "%PROJECT_DIR%"
            echo OUTPUT_DIR = "%OUTPUT_DIR%"
            ) > "%OUTPUT_STEM%.toml"

            "#},
        )
}

#[test]
fn project_script() {
    let build = prepare_project("script", true).build().unwrap();

    let out = build.read_output("songbook.toml");
    let out: HashMap<String, String> = toml::from_str(&out).unwrap();

    assert_eq!(out["BARD"], build.app().bard_exe().to_str().unwrap());
    assert_eq!(
        out["OUTPUT"],
        build.dir_output().join("songbook.html").to_str().unwrap()
    );
    assert_eq!(
        out["PROJECT_DIR"],
        build.unwrap().project_dir.to_str().unwrap()
    );
    assert_eq!(out["OUTPUT_DIR"], build.dir_output().to_str().unwrap());
}

#[test]
fn project_script_no_ps() {
    let build = prepare_project("script-no-ps", false).build().unwrap();
    build.try_read_output(".toml").unwrap_err();
}

#[test]
fn project_script_fail() {
    TestProject::new("script-fail")
        .postprocess(true)
        .output("songbook.html")
        .script(
            ".html",
            "script",
            indoc! {r#"
            #!/bin/sh
            kill $$
            "#},
            indoc! {r#"
            @ECHO OFF
            exit 1
            "#},
        )
        .build()
        .unwrap()
        .unwrap_err();
}