mirror of
https://github.com/CLIUtils/CLI11.git
synced 2025-05-07 07:33:51 +00:00
Adding parse order capture
This commit is contained in:
parent
05867bebe5
commit
3b04cd62af
@ -80,6 +80,9 @@ class App {
|
|||||||
///
|
///
|
||||||
/// This is faster and cleaner than storing just a list of strings and reparsing. This may contain the -- separator.
|
/// This is faster and cleaner than storing just a list of strings and reparsing. This may contain the -- separator.
|
||||||
missing_t missing_;
|
missing_t missing_;
|
||||||
|
|
||||||
|
/// This is a list of pointers to options with the orignal parse order
|
||||||
|
std::vector<Option*> parse_order_;
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
/// @name Subcommands
|
/// @name Subcommands
|
||||||
@ -710,6 +713,11 @@ class App {
|
|||||||
|
|
||||||
return local_name == name_to_check;
|
return local_name == name_to_check;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This gets a vector of pointers with the original parse order
|
||||||
|
const std::vector<Option*> &parse_order() const {
|
||||||
|
return parse_order_;
|
||||||
|
}
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
@ -949,6 +957,7 @@ class App {
|
|||||||
(static_cast<int>(opt->count()) < opt->get_expected() || opt->get_expected() < 0)) {
|
(static_cast<int>(opt->count()) < opt->get_expected() || opt->get_expected() < 0)) {
|
||||||
|
|
||||||
opt->add_result(positional);
|
opt->add_result(positional);
|
||||||
|
parse_order_.push_back(opt.get());
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1011,18 +1020,21 @@ class App {
|
|||||||
|
|
||||||
int num = op->get_expected();
|
int num = op->get_expected();
|
||||||
|
|
||||||
if(num == 0)
|
if(num == 0) {
|
||||||
op->add_result("");
|
op->add_result("");
|
||||||
else if(rest != "") {
|
parse_order_.push_back(op.get());
|
||||||
|
} else if(rest != "") {
|
||||||
if(num > 0)
|
if(num > 0)
|
||||||
num--;
|
num--;
|
||||||
op->add_result(rest);
|
op->add_result(rest);
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
rest = "";
|
rest = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(num == -1) {
|
if(num == -1) {
|
||||||
while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) {
|
while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) {
|
||||||
op->add_result(args.back());
|
op->add_result(args.back());
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -1031,6 +1043,7 @@ class App {
|
|||||||
std::string current_ = args.back();
|
std::string current_ = args.back();
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
op->add_result(current_);
|
op->add_result(current_);
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(rest != "") {
|
if(rest != "") {
|
||||||
@ -1075,19 +1088,23 @@ class App {
|
|||||||
if(num != -1)
|
if(num != -1)
|
||||||
num--;
|
num--;
|
||||||
op->add_result(value);
|
op->add_result(value);
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
} else if(num == 0) {
|
} else if(num == 0) {
|
||||||
op->add_result("");
|
op->add_result("");
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(num == -1) {
|
if(num == -1) {
|
||||||
while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) {
|
while(!args.empty() && _recognize(args.back()) == detail::Classifer::NONE) {
|
||||||
op->add_result(args.back());
|
op->add_result(args.back());
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
while(num > 0 && !args.empty()) {
|
while(num > 0 && !args.empty()) {
|
||||||
num--;
|
num--;
|
||||||
op->add_result(args.back());
|
op->add_result(args.back());
|
||||||
|
parse_order_.push_back(op.get());
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -501,6 +501,23 @@ TEST_F(TApp, VectorFancyOpts) {
|
|||||||
EXPECT_THROW(run(), CLI::ParseError);
|
EXPECT_THROW(run(), CLI::ParseError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TApp, OriginalOrder) {
|
||||||
|
std::vector<int> st1;
|
||||||
|
CLI::Option* op1 = app.add_option("-a", st1);
|
||||||
|
std::vector<int> st2;
|
||||||
|
CLI::Option* op2 = app.add_option("-b", st2);
|
||||||
|
|
||||||
|
args = {"-a", "1", "-b", "2", "-a3", "-a", "4"};
|
||||||
|
|
||||||
|
run();
|
||||||
|
|
||||||
|
EXPECT_EQ(st1, std::vector<int>({1,3,4}));
|
||||||
|
EXPECT_EQ(st2, std::vector<int>({2}));
|
||||||
|
|
||||||
|
EXPECT_EQ(app.parse_order(), std::vector<CLI::Option*>({op1, op2, op1, op1}));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(TApp, RequiresFlags) {
|
TEST_F(TApp, RequiresFlags) {
|
||||||
CLI::Option *opt = app.add_flag("-s,--string");
|
CLI::Option *opt = app.add_flag("-s,--string");
|
||||||
app.add_flag("--both")->requires(opt);
|
app.add_flag("--both")->requires(opt);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user