mirror of
https://github.com/clap-rs/clap
synced 2025-01-18 15:43:54 +00:00
22edac66d9
We normally set all app attributes at the end. This can be changed but will require some work to ensure - Top-level item's doc cmment ins our over flattened - We still support `Args` / `Subcommand` be used to initialize an `App` when creating a subcommand In the mean time, this special cases `help_heading` to happen first. We'll need this special casing anyways to address #2803 since we'll need to capture the old help heading before addings args and then restore it after. I guess we could unconditionally do that but its extra work / boilerplate for when people have to dig into their what the derives do. Fixes #2785
99 lines
2.6 KiB
Rust
99 lines
2.6 KiB
Rust
use clap::{Args, IntoApp, Parser};
|
|
|
|
#[test]
|
|
fn arg_help_heading_applied() {
|
|
#[derive(Debug, Clone, Parser)]
|
|
struct CliOptions {
|
|
#[clap(long)]
|
|
#[clap(help_heading = Some("HEADING A"))]
|
|
should_be_in_section_a: Option<u32>,
|
|
|
|
#[clap(long)]
|
|
no_section: Option<u32>,
|
|
}
|
|
|
|
let app = CliOptions::into_app();
|
|
|
|
let should_be_in_section_a = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "should-be-in-section-a")
|
|
.unwrap();
|
|
assert_eq!(should_be_in_section_a.get_help_heading(), Some("HEADING A"));
|
|
|
|
let should_be_in_section_b = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "no-section")
|
|
.unwrap();
|
|
assert_eq!(should_be_in_section_b.get_help_heading(), None);
|
|
}
|
|
|
|
#[test]
|
|
fn app_help_heading_applied() {
|
|
#[derive(Debug, Clone, Parser)]
|
|
#[clap(help_heading = "DEFAULT")]
|
|
struct CliOptions {
|
|
#[clap(long)]
|
|
#[clap(help_heading = Some("HEADING A"))]
|
|
should_be_in_section_a: Option<u32>,
|
|
|
|
#[clap(long)]
|
|
should_be_in_default_section: Option<u32>,
|
|
}
|
|
|
|
let app = CliOptions::into_app();
|
|
|
|
let should_be_in_section_a = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "should-be-in-section-a")
|
|
.unwrap();
|
|
assert_eq!(should_be_in_section_a.get_help_heading(), Some("HEADING A"));
|
|
|
|
let should_be_in_default_section = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "should-be-in-default-section")
|
|
.unwrap();
|
|
assert_eq!(
|
|
should_be_in_default_section.get_help_heading(),
|
|
Some("DEFAULT")
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn app_help_heading_flattened() {
|
|
#[derive(Debug, Clone, Parser)]
|
|
struct CliOptions {
|
|
#[clap(flatten)]
|
|
options_a: OptionsA,
|
|
|
|
#[clap(flatten)]
|
|
options_b: OptionsB,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Args)]
|
|
#[clap(help_heading = "HEADING A")]
|
|
struct OptionsA {
|
|
#[clap(long)]
|
|
should_be_in_section_a: Option<u32>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Args)]
|
|
#[clap(help_heading = "HEADING B")]
|
|
struct OptionsB {
|
|
#[clap(long)]
|
|
should_be_in_section_b: Option<u32>,
|
|
}
|
|
|
|
let app = CliOptions::into_app();
|
|
|
|
let should_be_in_section_a = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "should-be-in-section-a")
|
|
.unwrap();
|
|
assert_eq!(should_be_in_section_a.get_help_heading(), Some("HEADING A"));
|
|
|
|
let should_be_in_section_b = app
|
|
.get_arguments()
|
|
.find(|a| a.get_name() == "should-be-in-section-b")
|
|
.unwrap();
|
|
assert_eq!(should_be_in_section_b.get_help_heading(), Some("HEADING B"));
|
|
}
|