Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

default_value_if does not respect global(true) #5234

Open
2 tasks done
adamspofford-dfinity opened this issue Dec 1, 2023 · 1 comment
Open
2 tasks done

default_value_if does not respect global(true) #5234

adamspofford-dfinity opened this issue Dec 1, 2023 · 1 comment
Labels
A-parsing Area: Parser's logic and needs it changed somehow. C-bug Category: Updating dependencies S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing

Comments

@adamspofford-dfinity
Copy link

adamspofford-dfinity commented Dec 1, 2023

Please complete the following tasks

Rust Version

rustc 1.73.0 (cc66ad468 2023-10-03)

Clap Version

4.4.10, master (c0a1814)

Minimal reproducible code

use clap::{Parser, builder::ArgPredicate};
#[derive(Parser)]
struct Cmd {
    #[arg(
      default_value_if("default", ArgPredicate::IsPresent, "default value")
    )]
    param: Option<String>,
    #[arg(long, global = true)]
    default: bool,
    #[command(subcommand)]
    subcommand: Option<Subcommand>,
}
#[derive(Parser)]
enum Subcommand {
    Subcommand,
}
fn main() {
    let cmd = Cmd::parse();
    println!("param: {}", cmd.param.unwrap_or("<none>".into()));
}

Steps to reproduce the bug with the above code

cargo run -- --default
cargo run -- subcommand --default

Actual Behaviour

param: default value
param: <none>

Expected Behaviour

param: default value
param: default value

Additional Context

No response

Debug Output

[clap_builder::builder::command]Command::_do_parse
[clap_builder::builder::command]Command::_build: name="claptest"
[clap_builder::builder::command]Command::_propagate:claptest
[clap_builder::builder::command]Command::_check_help_and_version:claptest expand_help_tree=false
[clap_builder::builder::command]Command::long_help_exists
[clap_builder::builder::command]Command::_check_help_and_version: Building default --help
[clap_builder::builder::command]Command::_check_help_and_version: Building help subcommand
[clap_builder::builder::command]Command::_propagate_global_args:claptest
[clap_builder::builder::command]Command::_propagate pushing "default" to subcommand
[clap_builder::builder::debug_asserts]Command::_debug_asserts
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:param
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:default
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:help
[clap_builder::builder::debug_asserts]Command::_verify_positionals
[clap_builder::parser::parser]Parser::get_matches_with
[clap_builder::parser::parser]Parser::get_matches_with: Begin parsing '"subcommand"'
[clap_builder::parser::parser]Parser::possible_subcommand: arg=Ok("subcommand")
[clap_builder::parser::parser]Parser::get_matches_with: sc=Some("subcommand")
[clap_builder::parser::parser]Parser::parse_subcommand
[ clap_builder::output::usage]Usage::get_required_usage_from: incls=[], matcher=false, incl_last=true
[ clap_builder::output::usage]Usage::get_required_usage_from: unrolled_reqs=[]
[ clap_builder::output::usage]Usage::get_required_usage_from: ret_val=[]
[clap_builder::builder::command]Command::_build_subcommand Setting bin_name of subcommand to "claptest subcommand"
[clap_builder::builder::command]Command::_build_subcommand Setting display_name of subcommand to "claptest-subcommand"
[clap_builder::builder::command]Command::_build: name="subcommand"
[clap_builder::builder::command]Command::_propagate:subcommand
[clap_builder::builder::command]Command::_check_help_and_version:subcommand expand_help_tree=false
[clap_builder::builder::command]Command::long_help_exists
[clap_builder::builder::command]Command::_check_help_and_version: Building default --help
[clap_builder::builder::command]Command::_propagate_global_args:subcommand
[clap_builder::builder::debug_asserts]Command::_debug_asserts
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:default
[clap_builder::builder::debug_asserts]Arg::_debug_asserts:help
[clap_builder::builder::debug_asserts]Command::_verify_positionals
[clap_builder::parser::parser]Parser::parse_subcommand: About to parse sc=subcommand
[clap_builder::parser::parser]Parser::get_matches_with
[clap_builder::parser::parser]Parser::get_matches_with: Begin parsing '"--default"'
[clap_builder::parser::parser]Parser::possible_subcommand: arg=Ok("--default")
[clap_builder::parser::parser]Parser::get_matches_with: sc=None
[clap_builder::parser::parser]Parser::parse_long_arg
[clap_builder::parser::parser]Parser::parse_long_arg: Does it contain '='...
[clap_builder::parser::parser]Parser::parse_long_arg: Found valid arg or flag '--default'
[clap_builder::parser::parser]Parser::parse_long_arg("default"): Presence validated
[clap_builder::parser::parser]Parser::react action=SetTrue, identifier=Some(Long), source=CommandLine
[clap_builder::parser::parser]Parser::react: has default_missing_vals
[clap_builder::parser::parser]Parser::remove_overrides: id="default"
[clap_builder::parser::arg_matcher]ArgMatcher::start_custom_arg: id="default", source=CommandLine
[clap_builder::builder::command]Command::groups_for_arg: id="default"
[clap_builder::parser::parser]Parser::push_arg_values: ["true"]
[clap_builder::parser::parser]Parser::add_single_val_to_arg: cur_idx:=1
[clap_builder::parser::parser]Parser::get_matches_with: After parse_long_arg ValuesDone
[clap_builder::parser::parser]Parser::add_defaults
[clap_builder::parser::parser]Parser::add_defaults:iter:default:
[clap_builder::parser::parser]Parser::add_default_value: doesn't have conditional defaults
[clap_builder::parser::parser]Parser::add_default_value:iter:default: has default vals
[clap_builder::parser::parser]Parser::add_default_value:iter:default: was used
[clap_builder::parser::parser]Parser::add_defaults:iter:help:
[clap_builder::parser::parser]Parser::add_default_value: doesn't have conditional defaults
[clap_builder::parser::parser]Parser::add_default_value:iter:help: doesn't have default vals
[clap_builder::parser::validator]Validator::validate
[clap_builder::builder::command]Command::groups_for_arg: id="default"
[clap_builder::parser::validator]Conflicts::gather_direct_conflicts id="default", conflicts=[]
[clap_builder::parser::validator]Validator::validate_conflicts
[clap_builder::parser::validator]Validator::validate_exclusive
[clap_builder::parser::validator]Validator::validate_conflicts::iter: id="default"
[clap_builder::parser::validator]Conflicts::gather_conflicts: arg="default"
[clap_builder::parser::validator]Conflicts::gather_conflicts: conflicts=[]
[clap_builder::parser::validator]Validator::validate_required: required=ChildGraph([])
[clap_builder::parser::validator]Validator::gather_requires
[clap_builder::parser::validator]Validator::gather_requires:iter:"default"
[clap_builder::parser::validator]Validator::validate_required: is_exclusive_present=false
[clap_builder::parser::parser]Parser::add_defaults
[clap_builder::parser::parser]Parser::add_defaults:iter:param:
[clap_builder::parser::parser]Parser::add_default_value: has conditional defaults
[clap_builder::parser::parser]Parser::add_default_value:iter:param: doesn't have default vals
[clap_builder::parser::parser]Parser::add_defaults:iter:default:
[clap_builder::parser::parser]Parser::add_default_value: doesn't have conditional defaults
[clap_builder::parser::parser]Parser::add_default_value:iter:default: has default vals
[clap_builder::parser::parser]Parser::add_default_value:iter:default: wasn't used
[clap_builder::parser::parser]Parser::react action=SetTrue, identifier=None, source=DefaultValue
[clap_builder::parser::arg_matcher]ArgMatcher::start_custom_arg: id="default", source=DefaultValue
[clap_builder::parser::parser]Parser::push_arg_values: ["false"]
[clap_builder::parser::parser]Parser::add_single_val_to_arg: cur_idx:=1
[clap_builder::parser::parser]Parser::add_defaults:iter:help:
[clap_builder::parser::parser]Parser::add_default_value: doesn't have conditional defaults
[clap_builder::parser::parser]Parser::add_default_value:iter:help: doesn't have default vals
[clap_builder::parser::validator]Validator::validate
[clap_builder::parser::validator]Validator::validate_conflicts
[clap_builder::parser::validator]Validator::validate_exclusive
[clap_builder::parser::validator]Validator::validate_required: required=ChildGraph([])
[clap_builder::parser::validator]Validator::gather_requires
[clap_builder::parser::validator]Validator::validate_required: is_exclusive_present=false
[clap_builder::parser::arg_matcher]ArgMatcher::get_global_values: global_arg_vec=["default", "default"]
param: <none>
@adamspofford-dfinity adamspofford-dfinity added the C-bug Category: Updating dependencies label Dec 1, 2023
@epage
Copy link
Member

epage commented Dec 1, 2023

This is related to #1546 but I'm keeping it separate because solving it for the validation pass might not solve it for the default value pass.

@epage epage added A-parsing Area: Parser's logic and needs it changed somehow. S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing labels Dec 1, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-parsing Area: Parser's logic and needs it changed somehow. C-bug Category: Updating dependencies S-waiting-on-design Status: Waiting on user-facing design to be resolved before implementing
Projects
None yet
Development

No branches or pull requests

2 participants