2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
 
  25 #include "parser_state.h"
 
  27 #include "stg/common.h"
 
  37 typedef void (* FUNC0)();
 
  40 class FUNC0_ACTION : public ACTION
 
  43         explicit FUNC0_ACTION(const F & func) : m_func(func) {}
 
  45         std::string ParamDescription() const override { return ""; }
 
  46         std::string DefaultDescription() const override { return ""; }
 
  47         OPTION_BLOCK & Suboptions() override { return m_suboptions; }
 
  48         PARSER_STATE Parse(int argc, char ** argv, void * /*data*/) override
 
  51             return PARSER_STATE(true, argc, argv);
 
  56         OPTION_BLOCK m_suboptions;
 
  61 std::unique_ptr<ACTION> MakeFunc0Action(F func)
 
  63 return std::make_unique<FUNC0_ACTION<F>>(func);
 
  67 class PARAM_ACTION : public ACTION
 
  70         PARAM_ACTION(std::optional<T> & param,
 
  71                      const T & defaultValue,
 
  72                      const std::string & paramDescription)
 
  74               m_defaltValue(defaultValue),
 
  75               m_description(paramDescription),
 
  78         explicit PARAM_ACTION(std::optional<T> & param)
 
  82         PARAM_ACTION(std::optional<T> & param,
 
  83                      const std::string & paramDescription)
 
  85               m_description(paramDescription),
 
  89         std::string ParamDescription() const override { return m_description; }
 
  90         std::string DefaultDescription() const override;
 
  91         OPTION_BLOCK & Suboptions() override { return m_suboptions; }
 
  92         PARSER_STATE Parse(int argc, char ** argv, void * /*data*/) override;
 
  93         void ParseValue(const std::string & value) override;
 
  96         std::optional<T> & m_param;
 
  98         std::string m_description;
 
 100         OPTION_BLOCK m_suboptions;
 
 103 template <typename T>
 
 105 std::string PARAM_ACTION<T>::DefaultDescription() const
 
 107 return m_hasDefault ? " (default: '" + std::to_string(m_defaltValue) + "')"
 
 113 std::string PARAM_ACTION<std::string>::DefaultDescription() const
 
 115 return m_hasDefault ? " (default: '" + m_defaltValue + "')"
 
 119 template <typename T>
 
 121 PARSER_STATE PARAM_ACTION<T>::Parse(int argc, char ** argv, void * /*data*/)
 
 126     throw ERROR("Missing argument.");
 
 128 if (str2x(*argv, value))
 
 129     throw ERROR(std::string("Bad argument: '") + *argv + "'");
 
 131 return PARSER_STATE(false, --argc, ++argv);
 
 136 PARSER_STATE PARAM_ACTION<bool>::Parse(int argc, char ** argv, void * /*data*/)
 
 139 return PARSER_STATE(false, argc, argv);
 
 142 template <typename T>
 
 144 void PARAM_ACTION<T>::ParseValue(const std::string & stringValue)
 
 146 if (stringValue.empty())
 
 147     throw ERROR("Missing value.");
 
 149 if (str2x(stringValue, value))
 
 150     throw ERROR(std::string("Bad value: '") + stringValue + "'");
 
 156 void PARAM_ACTION<std::string>::ParseValue(const std::string & stringValue)
 
 158 m_param = stringValue;
 
 163 PARSER_STATE PARAM_ACTION<std::string>::Parse(int argc, char ** argv, void * /*data*/)
 
 168     throw ERROR("Missing argument.");
 
 170 return PARSER_STATE(false, --argc, ++argv);
 
 173 template <typename T>
 
 175 std::unique_ptr<ACTION> MakeParamAction(std::optional<T> & param,
 
 176                                         const T & defaultValue,
 
 177                                         const std::string & paramDescription)
 
 179 return std::make_unique<PARAM_ACTION<T>>(param, defaultValue, paramDescription);
 
 182 template <typename T>
 
 184 std::unique_ptr<ACTION> MakeParamAction(std::optional<T> & param)
 
 186 return std::make_unique<PARAM_ACTION<T>>(param);
 
 189 template <typename T>
 
 191 std::unique_ptr<ACTION> MakeParamAction(std::optional<T> & param,
 
 192                                         const std::string & paramDescription)
 
 194 return std::make_unique<PARAM_ACTION<T>>(param, paramDescription);
 
 197 class KV_ACTION : public ACTION
 
 200         KV_ACTION(const std::string & name,
 
 201                   const std::string & paramDescription)
 
 203               m_description(paramDescription)
 
 206         std::string ParamDescription() const override { return m_description; }
 
 207         std::string DefaultDescription() const override { return ""; }
 
 208         OPTION_BLOCK & Suboptions() override { return m_suboptions; }
 
 209         PARSER_STATE Parse(int argc, char ** argv, void * data) override;
 
 213         std::string m_description;
 
 214         OPTION_BLOCK m_suboptions;
 
 218 PARSER_STATE KV_ACTION::Parse(int argc, char ** argv, void * data)
 
 223     throw ERROR("Missing argument.");
 
 224 assert(data != NULL && "Expecting container pointer.");
 
 225 std::map<std::string, std::string> & kvs = *static_cast<std::map<std::string, std::string>*>(data);
 
 227 return PARSER_STATE(false, --argc, ++argv);
 
 231 std::unique_ptr<ACTION> MakeKVAction(const std::string & name,
 
 232                                      const std::string & paramDescription)
 
 234 return std::make_unique<KV_ACTION>(name, paramDescription);
 
 237 } // namespace SGCONF