summaryrefslogtreecommitdiffstats
path: root/sqv/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'sqv/build.rs')
-rw-r--r--sqv/build.rs78
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(())
+}