diff --git a/src/gen/zsh.rs b/src/gen/zsh.rs index df6e76f..56b9b3c 100644 --- a/src/gen/zsh.rs +++ b/src/gen/zsh.rs @@ -102,8 +102,8 @@ fn generate_fn( if !cmd_info.subcommands.is_empty() { out.push_str(&format!("{INDENT}case $line[{}] in\n", pos + 1)); - for _sub_cmd in cmd_info.subcommands.keys() { - todo!() + for sub_cmd in cmd_info.subcommands.keys() { + out.push_str(&format!("{INDENT}{INDENT}{sub_cmd}) {sub_cmd};;")) } out.push_str(&format!("{INDENT}esac\n")); } diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 1a7f750..7894704 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -7,7 +7,7 @@ use flate2::bufread::GzDecoder; use log::{debug, error, trace, warn}; use regex::Regex; use std::{ - collections::{HashMap, HashSet}, + collections::{hash_map::Entry, HashMap, HashSet}, fs::File, io::{BufReader, Read}, path::{Path, PathBuf}, @@ -181,6 +181,26 @@ impl ManParseConfig { } } +fn insert_cmd( + subcommands: &mut HashMap, + mut cmd_parts: Vec, + mut args: Vec, +) { + let head = cmd_parts.remove(0); + let cmd = match subcommands.entry(head) { + Entry::Occupied(o) => o.into_mut(), + Entry::Vacant(v) => v.insert(CommandInfo { + args: Vec::new(), + subcommands: HashMap::new(), + }), + }; + if cmd_parts.is_empty() { + cmd.args.append(&mut args); + } else { + insert_cmd(&mut cmd.subcommands, cmd_parts, args); + } +} + fn parse_all_manpages(manpages: Vec<(String, PathBuf)>) -> HashMap { let mut res = HashMap::new(); @@ -190,14 +210,10 @@ fn parse_all_manpages(manpages: Vec<(String, PathBuf)>) -> HashMap { trace!("Parsing man page for {} at {}", cmd_name, manpage.display()); - // todo merge subcommands later instead - res.insert( - cmd_name, - CommandInfo { - args: parsed, - subcommands: HashMap::new(), - }, - ); + match detect_subcommand(&cmd_name, &text) { + Some(cmd_parts) => insert_cmd(&mut res, cmd_parts, parsed), + None => insert_cmd(&mut res, vec![cmd_name], parsed), + } } None => { error!("Could not parse manpage for {}", cmd_name); @@ -212,8 +228,6 @@ fn parse_all_manpages(manpages: Vec<(String, PathBuf)>) -> HashMap instead of the current working directory....]' \ - '-c[Pass a configuration parameter to the command. The value given will override ...]' \ - '--config-env[Like -c =, give configuration variable a value, where instead of the worktree. See gitattributes...]' \ - '*::args->args' -}