use crate::tree::Tree;
impl Tree {
#[cfg(feature = "arbitrary-clap")]
pub fn from_clap_command(cmd: &clap::Command) -> Self {
let name = cmd.get_name().to_string();
let mut children = Vec::new();
for subcmd in cmd.get_subcommands() {
children.push(Self::from_clap_command(subcmd));
}
for arg in cmd.get_arguments() {
let mut arg_parts = Vec::new();
if let Some(short) = arg.get_short() {
arg_parts.push(format!("-{}", short));
}
if let Some(long) = arg.get_long() {
if !arg_parts.is_empty() {
arg_parts.push(", ".to_string());
}
arg_parts.push(format!("--{}", long));
}
if arg_parts.is_empty() {
arg_parts.push(arg.get_id().as_str().to_string());
}
let mut arg_label = format!("arg: {}", arg_parts.join(""));
if let Some(help) = arg.get_help() {
arg_label.push_str(&format!(" ({})", help));
}
children.push(Tree::new_leaf(arg_label));
}
if children.is_empty() {
Tree::new_leaf(name)
} else {
Tree::Node(name, children)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[cfg(feature = "arbitrary-clap")]
#[test]
fn test_from_clap_command() {
use clap::Command;
let cmd = Command::new("test").subcommand(Command::new("sub"));
let tree = Tree::from_clap_command(&cmd);
assert!(tree.is_node());
assert_eq!(tree.label(), Some("test"));
}
#[cfg(feature = "arbitrary-clap")]
#[test]
fn test_from_clap_command_with_args() {
use clap::{Arg, Command};
let cmd = Command::new("test").arg(Arg::new("input").short('i').long("input"));
let tree = Tree::from_clap_command(&cmd);
assert!(tree.is_node());
}
}