A better Rust ATProto crate
1use clap::CommandFactory;
2use clap_complete::{generate_to, shells};
3use clap_mangen::Man;
4use std::env;
5use std::fs;
6use std::io::Result;
7use std::path::PathBuf;
8
9#[path = "src/cli.rs"]
10mod cli;
11
12fn main() -> Result<()> {
13 let out_dir = PathBuf::from(env::var("OUT_DIR").expect("OUT_DIR not set"));
14
15 // Generate docs for lex-fetch
16 generate_docs_for_binary(&out_dir, cli::LexFetchArgs::command(), "lex-fetch")?;
17
18 // Generate docs for jacquard-codegen
19 generate_docs_for_binary(&out_dir, cli::CodegenArgs::command(), "jacquard-codegen")?;
20
21 println!(
22 "cargo:warning=Generated man pages and completions to {:?}",
23 out_dir
24 );
25
26 Ok(())
27}
28
29fn generate_docs_for_binary(
30 out_dir: &PathBuf,
31 mut cmd: clap::Command,
32 bin_name: &str,
33) -> Result<()> {
34 // Generate man page
35 let man_dir = out_dir.join("man");
36 fs::create_dir_all(&man_dir)?;
37
38 let man = Man::new(cmd.clone());
39 let mut man_buffer = Vec::new();
40 man.render(&mut man_buffer)?;
41 fs::write(man_dir.join(format!("{}.1", bin_name)), man_buffer)?;
42
43 // Generate shell completions
44 let comp_dir = out_dir.join("completions");
45 fs::create_dir_all(&comp_dir)?;
46
47 generate_to(shells::Bash, &mut cmd, bin_name, &comp_dir)?;
48 generate_to(shells::Fish, &mut cmd, bin_name, &comp_dir)?;
49 generate_to(shells::Zsh, &mut cmd, bin_name, &comp_dir)?;
50
51 Ok(())
52}