mirror of
https://github.com/sametersoylu/argument-parser.git
synced 2026-05-28 20:08:10 +00:00
feat: add reference capabilities to positional arguments. use existing
v2 api to capture reference arguments.
This commit is contained in:
@@ -368,12 +368,8 @@ private:
|
||||
throw std::logic_error("reference() was selected without a target.");
|
||||
}
|
||||
|
||||
pairs[argument_parser::v2::flags::Reference] = target;
|
||||
parser.template add_argument<store_type>(pairs);
|
||||
parser.on_complete([target, key](argument_parser::base_parser const& completed_parser) {
|
||||
if (auto value = completed_parser.template get_optional<store_type>(key)) {
|
||||
*target = value.value();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
auto build_parametered_action(argument_parser::v2::base_parser& parser) const -> void {
|
||||
|
||||
@@ -154,9 +154,13 @@ namespace argument_parser::v2 {
|
||||
found_params[extended_add_argument_flags::Action] = true;
|
||||
if constexpr (!std::is_same_v<T, void>) {
|
||||
auto ref = get_or_throw<T*>(argument_pairs.at(add_argument_flags::Reference), "reference");
|
||||
if (action) {
|
||||
throw std::logic_error("Cannot use both action and reference for the same argument");
|
||||
} else {
|
||||
action = helpers::make_parametered_action<T>([ref](T const& t) {
|
||||
*ref = t;
|
||||
}).clone();
|
||||
}
|
||||
} else {
|
||||
throw std::logic_error("Reference argument must not be void");
|
||||
}
|
||||
@@ -255,6 +259,26 @@ namespace argument_parser::v2 {
|
||||
position = get_or_throw<int>(argument_pairs.at(add_argument_flags::Position), "position");
|
||||
}
|
||||
|
||||
if (argument_pairs.find(add_argument_flags::Reference) != argument_pairs.end()) {
|
||||
if (!IsTyped) {
|
||||
throw std::logic_error("Reference argument must be typed");
|
||||
}
|
||||
|
||||
if constexpr (!std::is_same_v<T, void>) {
|
||||
auto ref = get_or_throw<T*>(argument_pairs.at(add_argument_flags::Reference), "reference");
|
||||
if (action) {
|
||||
throw std::logic_error("Cannot use both action and reference for the same argument");
|
||||
} else {
|
||||
action = helpers::make_parametered_action<T>([ref](T const& t) {
|
||||
*ref = t;
|
||||
}).clone();
|
||||
}
|
||||
} else {
|
||||
throw std::logic_error("Reference argument must not be void");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (help_text.empty()) {
|
||||
if constexpr (IsTyped) {
|
||||
if constexpr (internal::sfinae::has_format_hint<parsing_traits::parser_trait<T>>::value &&
|
||||
|
||||
Reference in New Issue
Block a user