cmdopt2/args: move repeat into base arg
This commit is contained in:
parent
153844eded
commit
9caba84fc6
@ -111,13 +111,18 @@ namespace cruft::cmdopt2 {
|
|||||||
res.required_ = val;
|
res.required_ = val;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
bool repeat_;
|
||||||
|
BaseT repeat (bool val) const
|
||||||
|
{
|
||||||
|
BaseT res = get ();
|
||||||
|
res.repeat_ = val;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct positional_t : public ops_t<positional_t> {
|
struct positional_t : public ops_t<positional_t> {
|
||||||
positional_t ignore (void) const;
|
positional_t ignore (void) const;
|
||||||
|
|
||||||
int count = 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
positional_t positional (char const *name);
|
positional_t positional (char const *name);
|
||||||
|
@ -223,6 +223,45 @@ test_required (cruft::TAP::logger &tap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void
|
||||||
|
test_repeated (cruft::TAP::logger &tap)
|
||||||
|
{
|
||||||
|
static const struct {
|
||||||
|
std::vector<char const*> args;
|
||||||
|
std::vector<int> values;
|
||||||
|
} TESTS[] = {
|
||||||
|
{ .args = { "cmd" }, .values = { } },
|
||||||
|
{ .args = { "cmd", "1", }, .values = { 1, } },
|
||||||
|
{ .args = { "cmd", "1", "1", }, .values = { 1, 1, } },
|
||||||
|
{ .args = { "cmd", "-v", "1", }, .values = { 1, } },
|
||||||
|
{ .args = { "cmd", "-v", "1", "-v", "1"}, .values = { 1, 1 } },
|
||||||
|
{ .args = { "cmd", "--foo", "1", }, .values = { 1, } },
|
||||||
|
{ .args = { "cmd", "--foo", "1", "--foo", "1"}, .values = { 1, 1, } },
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<int> values;
|
||||||
|
|
||||||
|
using namespace cruft::cmdopt2;
|
||||||
|
parser p ("test suite");
|
||||||
|
p.add (keyword ("value").flag ('v').repeat (true).bind (values));
|
||||||
|
p.add (keyword ("foo").repeat (true).bind (values));
|
||||||
|
p.add (positional ("var").repeat (true).bind (values));
|
||||||
|
|
||||||
|
for (auto const &t: TESTS) {
|
||||||
|
values.clear ();
|
||||||
|
|
||||||
|
auto const consumed = p.parse (int (t.args.size ()), t.args.data ());
|
||||||
|
tap.expect (
|
||||||
|
consumed == int (t.args.size ())
|
||||||
|
and values == t.values,
|
||||||
|
"{}",
|
||||||
|
fmt::join (t.args.begin (), t.args.end (), " ")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
@ -230,5 +269,6 @@ int main ()
|
|||||||
test_combinations (tap);
|
test_combinations (tap);
|
||||||
test_presence (tap);
|
test_presence (tap);
|
||||||
test_required (tap);
|
test_required (tap);
|
||||||
|
test_repeated (tap);
|
||||||
return tap.status ();
|
return tap.status ();
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user