aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Belikov <pavel.fuchs.belikov@gmail.com>2017-11-18 15:54:08 +0300
committerPavel Belikov <pavel.fuchs.belikov@gmail.com>2017-11-18 15:54:08 +0300
commit0996557a530692d276fd247995523344bfae084a (patch)
tree06e46cad4159bbe0b9fc93b4865c338114e4312e
parentMerge pull request #43 from pavel-belikov/better-help (diff)
downloadargs.hxx-0996557a530692d276fd247995523344bfae084a.tar.xz
add ActionFlag
-rw-r--r--args.hxx36
-rw-r--r--test.cxx19
2 files changed, 55 insertions, 0 deletions
diff --git a/args.hxx b/args.hxx
index 7af24c4..7a4ccf7 100644
--- a/args.hxx
+++ b/args.hxx
@@ -2577,6 +2577,42 @@ namespace args
}
};
+ /** A flag class that calls a function when it's matched
+ */
+ class ActionFlag : public FlagBase
+ {
+ private:
+ std::function<void(const std::vector<std::string> &)> action;
+ Nargs nargs;
+
+ public:
+ ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, Nargs nargs_, std::function<void(const std::vector<std::string> &)> action_, Options options_ = {}):
+ FlagBase(name_, help_, std::move(matcher_), options_), action(std::move(action_)), nargs(nargs_)
+ {
+ group_.Add(*this);
+ }
+
+ ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, std::function<void(const std::string &)> action_, Options options_ = {}):
+ FlagBase(name_, help_, std::move(matcher_), options_), nargs(1)
+ {
+ group_.Add(*this);
+ action = [action_](const std::vector<std::string> &a) { return action_(a.at(0)); };
+ }
+
+ ActionFlag(Group &group_, const std::string &name_, const std::string &help_, Matcher &&matcher_, std::function<void()> action_, Options options_ = {}):
+ FlagBase(name_, help_, std::move(matcher_), options_), nargs(0)
+ {
+ group_.Add(*this);
+ action = [action_](const std::vector<std::string> &) { return action_(); };
+ }
+
+ virtual Nargs NumberOfArguments() const noexcept override
+ { return nargs; }
+
+ virtual void ParseValue(const std::vector<std::string> &value) override
+ { action(value); }
+ };
+
/** A default Reader class for argument classes
*
* Simply uses a std::istringstream to read into the destination type, and
diff --git a/test.cxx b/test.cxx
index 1189f97..5f97c87 100644
--- a/test.cxx
+++ b/test.cxx
@@ -1066,6 +1066,25 @@ TEST_CASE("HelpParams work as expected", "[args]")
}
+TEST_CASE("ActionFlag works as expected", "[args]")
+{
+ args::ArgumentParser p("parser");
+ std::string s;
+
+ args::ActionFlag action0(p, "name", "description", {'x'}, [&]() { s = "flag"; });
+ args::ActionFlag action1(p, "name", "description", {'y'}, [&](const std::string &arg) { s = arg; });
+ args::ActionFlag actionN(p, "name", "description", {'z'}, 2, [&](const std::vector<std::string> &arg) { s = arg[0] + arg[1]; });
+
+ p.ParseArgs(std::vector<std::string>{"-x"});
+ REQUIRE(s == "flag");
+
+ p.ParseArgs(std::vector<std::string>{"-y", "a"});
+ REQUIRE(s == "a");
+
+ p.ParseArgs(std::vector<std::string>{"-z", "a", "b"});
+ REQUIRE(s == "ab");
+}
+
#undef ARGS_HXX
#define ARGS_TESTNAMESPACE
#define ARGS_NOEXCEPT