lexd 0.8.8

Command-line interface for the lex format
Documentation
#[cfg(unix)]
mod unix {
    use assert_cmd::cargo::cargo_bin_cmd;
    use std::fs;
    use std::os::unix::fs::PermissionsExt;
    use tempfile::tempdir;

    fn write_stub_chrome() -> (tempfile::TempDir, std::path::PathBuf) {
        let dir = tempdir().unwrap();
        let script_path = dir.path().join("fake-chrome.sh");
        let script = r#"#!/bin/sh
OUTPUT=""
for arg in "$@"; do
  case $arg in
    --print-to-pdf=*)
      OUTPUT="${arg#*=}"
      ;;
  esac
done
printf '%%PDF-1.7\n%%%%EOF\n' > "$OUTPUT"
"#;
        fs::write(&script_path, script).unwrap();
        let mut perms = fs::metadata(&script_path).unwrap().permissions();
        perms.set_mode(0o755);
        fs::set_permissions(&script_path, perms).unwrap();
        (dir, script_path)
    }

    #[test]
    fn cli_converts_to_pdf_with_stub() {
        let (_dir, chrome_stub) = write_stub_chrome();
        let output_dir = tempdir().unwrap();
        let output_pdf = output_dir.path().join("out.pdf");

        let mut cmd = cargo_bin_cmd!("lexd");
        cmd.env("LEX_CHROME_BIN", &chrome_stub)
            .arg("../../comms/specs/benchmark/010-kitchensink.lex")
            .arg("--to")
            .arg("pdf")
            .arg("-o")
            .arg(&output_pdf)
            .arg("--pdf-size")
            .arg("mobile");

        cmd.assert().success();

        let pdf = fs::read(&output_pdf).unwrap();
        assert!(pdf.starts_with(b"%PDF"));
    }

    #[test]
    fn cli_pdf_requires_output_path() {
        let (_dir, chrome_stub) = write_stub_chrome();
        let mut cmd = cargo_bin_cmd!("lexd");
        cmd.env("LEX_CHROME_BIN", &chrome_stub)
            .arg("../../comms/specs/benchmark/010-kitchensink.lex")
            .arg("--to")
            .arg("pdf");

        cmd.assert().failure();
    }
}

#[cfg(not(unix))]
#[test]
fn pdf_cli_tests_skipped() {
    eprintln!("Skipping PDF CLI tests on non-Unix platforms");
}