use std::env;
use std::fs;
use std::process::Command;
const MAN_PATH: &str = "docs/hypershunt.1";
fn main() {
println!("cargo:rerun-if-changed={MAN_PATH}");
println!("cargo:rerun-if-changed=build.rs");
sync_man_version();
regenerate_markdown_mirror();
}
fn sync_man_version() {
let Ok(version) = env::var("CARGO_PKG_VERSION") else {
return;
};
let Ok(man) = fs::read_to_string(MAN_PATH) else {
return;
};
if let Some(updated) = replace_th_version(&man, &version) {
fs::write(MAN_PATH, updated)
.expect("write docs/hypershunt.1 (version sync)");
}
}
fn replace_th_version(man: &str, version: &str) -> Option<String> {
let th_start = if man.starts_with(".TH ") {
0
} else {
man.find("\n.TH ")? + 1
};
let th_end = man[th_start..]
.find('\n')
.map_or(man.len(), |n| th_start + n);
let needle = "\"hypershunt ";
let rel = man[th_start..th_end].find(needle)?;
let start = th_start + rel + needle.len();
let end = start + man[start..].find('"')?;
if &man[start..end] == version {
return None;
}
let mut out = man.to_string();
out.replace_range(start..end, version);
Some(out)
}
fn regenerate_markdown_mirror() {
let header = "<!-- GENERATED from docs/hypershunt.1 at build time \
(build.rs). DO NOT EDIT BY HAND. -->\n\n";
match Command::new("pandoc")
.args(["--from=man", "--to=gfm", "--wrap=none", MAN_PATH])
.output()
{
Ok(out) if out.status.success() => {
let mut md = String::from(header);
md.push_str(&String::from_utf8_lossy(&out.stdout));
fs::write("docs/manual.md", md).expect("write docs/manual.md");
}
Ok(out) => println!(
"cargo:warning=pandoc failed; docs/manual.md not \
regenerated: {}",
String::from_utf8_lossy(&out.stderr)
),
Err(_) => println!(
"cargo:warning=pandoc not found; docs/manual.md not \
regenerated (install pandoc to refresh the man-page mirror)"
),
}
}