+template <typename T>
+inline
+std::unique_ptr<ACTION> MakeParamAction(std::optional<T> & param,
+ const std::string & paramDescription)
+{
+return std::make_unique<PARAM_ACTION<T>>(param, paramDescription);
+}
+
+class KV_ACTION : public ACTION
+{
+ public:
+ KV_ACTION(const std::string & name,
+ const std::string & paramDescription)
+ : m_name(name),
+ m_description(paramDescription)
+ {}
+
+ std::string ParamDescription() const override { return m_description; }
+ std::string DefaultDescription() const override { return ""; }
+ OPTION_BLOCK & Suboptions() override { return m_suboptions; }
+ PARSER_STATE Parse(int argc, char ** argv, void * data) override;
+
+ private:
+ std::string m_name;
+ std::string m_description;
+ OPTION_BLOCK m_suboptions;
+};
+
+inline
+PARSER_STATE KV_ACTION::Parse(int argc, char ** argv, void * data)
+{
+if (argc == 0 ||
+ argv == NULL ||
+ *argv == NULL)
+ throw ERROR("Missing argument.");
+assert(data != NULL && "Expecting container pointer.");
+std::map<std::string, std::string> & kvs = *static_cast<std::map<std::string, std::string>*>(data);
+kvs[m_name] = *argv;
+return PARSER_STATE(false, --argc, ++argv);
+}
+
+inline
+std::unique_ptr<ACTION> MakeKVAction(const std::string & name,
+ const std::string & paramDescription)
+{
+return std::make_unique<KV_ACTION>(name, paramDescription);
+}