diff options
Diffstat (limited to 'sqv/build.rs')
-rw-r--r-- | sqv/build.rs | 78 |
1 files changed, 76 insertions, 2 deletions
diff --git a/sqv/build.rs b/sqv/build.rs index 7c1eda1c..b53caa33 100644 --- a/sqv/build.rs +++ b/sqv/build.rs @@ -1,7 +1,6 @@ -use clap; - use std::env; use std::fs; +use std::io::{self, Write}; use clap::Shell; mod sqv_cli { @@ -9,6 +8,19 @@ mod sqv_cli { } fn main() { + println!("cargo:rerun-if-changed=build.rs"); + + // XXX: Revisit once + // https://github.com/rust-lang/rust/issues/44732 is stabilized. + + let mut sqv = sqv_cli::build(); + let mut main = fs::File::create("src/sqv-usage.rs").unwrap(); + dump_help(&mut main, + &mut sqv, + vec![], + "#").unwrap(); + writeln!(main, "\ninclude!(\"sqv.rs\");").unwrap(); + let outdir = match env::var_os("CARGO_TARGET_DIR") { None => return, Some(outdir) => outdir, @@ -20,3 +32,65 @@ fn main() { sqv.gen_completions("sqv", *shell, &outdir); } } + +fn dump_help(sink: &mut dyn io::Write, + sqv: &mut clap::App, + cmd: Vec<String>, + heading: &str) + -> io::Result<()> +{ + + if cmd.is_empty() { + writeln!(sink, "//! A command-line frontend for Sequoia.")?; + writeln!(sink, "//!")?; + writeln!(sink, "//! # Usage")?; + } else { + writeln!(sink, "//!")?; + writeln!(sink, "//! {} Subcommand {}", heading, cmd.join(" "))?; + } + + writeln!(sink, "//!")?; + + let args = std::iter::once("sqv") + .chain(cmd.iter().map(|s| s.as_str())) + .chain(std::iter::once("--help")) + .collect::<Vec<_>>(); + + let help = sqv.get_matches_from_safe_borrow(&args) + .unwrap_err().to_string(); + + writeln!(sink, "//! ```text")?; + for line in help.trim_end().split("\n").skip(1) { + if line == "" { + writeln!(sink, "//!")?; + } else { + writeln!(sink, "//! {}", line.trim_end())?; + } + } + writeln!(sink, "//! ```")?; + + // Recurse. + let mut found_subcommands = false; + for subcmd in help.split("\n").filter_map(move |line| { + if line == "SUBCOMMANDS:" { + found_subcommands = true; + None + } else if found_subcommands { + if line.chars().nth(4).map(|c| ! c.is_ascii_whitespace()) + .unwrap_or(false) + { + line.trim_start().split(" ").nth(0) + } else { + None + } + } else { + None + } + }).filter(|subcmd| *subcmd != "help") { + let mut c = cmd.clone(); + c.push(subcmd.into()); + dump_help(sink, sqv, c, &format!("{}#", heading))?; + } + + Ok(()) +} |