use std::{fs, path::PathBuf};
use anyhow::Result;
use clap::{Command, Parser};
use clap_mangen::Man;
use log::info;
use crate::{clap::parsers::path_parser, printer::Printer};
#[derive(Debug, Parser)]
pub struct ManualCommand {
#[arg(value_parser = path_parser)]
pub dir: PathBuf,
}
impl ManualCommand {
pub fn execute(self, printer: &mut impl Printer, command: Command) -> Result<()> {
let dir = &self.dir;
let cmd_name = command.get_name().to_string();
let subcmds = command.get_subcommands().cloned().collect::<Vec<_>>();
let subcmds_len = subcmds.len() + 1;
let mut buffer = Vec::new();
Man::new(command).render(&mut buffer)?;
fs::create_dir_all(&dir)?;
info!("generate man page for command {cmd_name}");
fs::write(dir.join(format!("{}.1", cmd_name)), buffer)?;
for subcmd in subcmds {
let subcmd_name = subcmd.get_name().to_string();
let mut buffer = Vec::new();
Man::new(subcmd).render(&mut buffer)?;
info!("generate man page for subcommand {subcmd_name}");
fs::write(dir.join(format!("{}-{}.1", cmd_name, subcmd_name)), buffer)?;
}
printer.out(format!(
"{subcmds_len} man page(s) successfully generated in {}",
dir.display()
))
}
}