use std::env;
use std::fs;
use std::path::Path;
use std::path::PathBuf;
use anyhow::Context;
pub mod man;
type Result<T, E=anyhow::Error> = std::result::Result<T, E>;
pub const ASSET_OUT_DIR: &str = "ASSET_OUT_DIR";
pub fn asset_out_dir(asset: &str) -> Result<PathBuf> {
println!("cargo:rerun-if-env-changed={}", ASSET_OUT_DIR);
let outdir: PathBuf =
env::var_os(ASSET_OUT_DIR).unwrap_or_else(
|| env::var_os("OUT_DIR").expect("OUT_DIR not set")).into();
if outdir.exists() && ! outdir.is_dir() {
return Err(anyhow::anyhow!("{}={:?} is not a directory",
ASSET_OUT_DIR, outdir));
}
let path = outdir.join(asset);
fs::create_dir_all(&path)?;
Ok(path)
}
pub const MAN_PANDOC_LUA: &[u8] = include_bytes!("man-pandoc.lua");
pub const MAN_PANDOC_INC_HTML: &[u8] = include_bytes!("man-pandoc.inc.html");
pub fn generate_man_pages(asset_dir: &Path, cli: &clap::Command,
version: &str, extra_version: Option<&str>)
-> Result<()>
{
let mut man2html = String::new();
man2html.push_str("#! /bin/bash\n");
man2html.push_str("# Convert the man pages to HTML using pandoc.\n");
man2html.push_str("\n");
man2html.push_str("set -e\n\n");
man2html.push_str("cd $(dirname $0)\n\n");
man2html.push_str("for man_page in");
for man in man::manpages(cli, version, extra_version) {
man2html.push_str(&format!(" {}", man.filename().display()));
std::fs::write(asset_dir.join(man.filename()), man.troff_source())?;
}
man2html.push_str("\ndo\n");
man2html.push_str(" pandoc -s $man_page -L man-pandoc.lua -H man-pandoc.inc.html -o $man_page.html\n");
man2html.push_str("done\n");
let target = asset_dir.join("man-pandoc.lua");
std::fs::write(&target, MAN_PANDOC_LUA)
.with_context(|| format!("Writing {}", target.display()))?;
let target = asset_dir.join("man-pandoc.inc.html");
std::fs::write(&target, MAN_PANDOC_INC_HTML)
.with_context(|| format!("Writing {}", target.display()))?;
let target = asset_dir.join("man2html.sh");
std::fs::write(&target, man2html.as_bytes())
.with_context(|| format!("Writing {}", target.display()))?;
println!("cargo:warning=man pages written to {}", asset_dir.display());
Ok(())
}