]> git.stg.codes - stg.git/blob - projects/sgconf/api_action.h
e10840cfabc63931f1bc06f6ba8d20cea914ec86
[stg.git] / projects / sgconf / api_action.h
1 #ifndef __STG_SGCONF_API_ACTION_H__
2 #define __STG_SGCONF_API_ACTION_H__
3
4 #include "action.h"
5
6 #include "options.h"
7
8 #include <string>
9 #include <map>
10 #include <vector>
11
12 namespace SGCONF
13 {
14
15 typedef bool (* API_FUNCTION) (const CONFIG &,
16                                const std::string &,
17                                const std::map<std::string, std::string> &);
18
19 class COMMAND
20 {
21     public:
22         COMMAND(API_FUNCTION funPtr,
23                 const std::string & arg,
24                 const std::map<std::string, std::string> & options)
25             : m_funPtr(funPtr),
26               m_arg(arg),
27               m_options(options)
28         {}
29         bool Execute(const SGCONF::CONFIG & config) const
30         {
31             return m_funPtr(config, m_arg, m_options);
32         }
33
34     private:
35         API_FUNCTION m_funPtr;
36         std::string m_arg;
37         std::map<std::string, std::string> m_options;
38 };
39
40 class COMMANDS
41 {
42     public:
43         void Add(API_FUNCTION funPtr,
44                  const std::string & arg,
45                  const std::map<std::string, std::string> & options) { m_commands.push_back(COMMAND(funPtr, arg, options)); }
46         bool Execute(const SGCONF::CONFIG & config) const
47         {
48             std::vector<COMMAND>::const_iterator it(m_commands.begin());
49             bool res = true;
50             while (it != m_commands.end() && res)
51             {
52                 res = res && it->Execute(config);
53                 ++it;
54             }
55             return res;
56         }
57     private:
58         std::vector<COMMAND> m_commands;
59 };
60
61 class API_ACTION : public ACTION
62 {
63     public:
64         struct PARAM
65         {
66             std::string name;
67             std::string shortDescr;
68             std::string longDescr;
69         };
70
71         API_ACTION(COMMANDS & commands,
72                    const std::string & paramDescription,
73                    bool needArgument,
74                    const std::vector<PARAM> & params,
75                    API_FUNCTION funPtr);
76         API_ACTION(COMMANDS & commands,
77                    const std::string & paramDescription,
78                    bool needArgument,
79                    API_FUNCTION funPtr)
80             : m_commands(commands),
81               m_description(paramDescription),
82               m_argument(needArgument ? "1" : ""), // Hack
83               m_funPtr(funPtr)
84         {}
85
86         virtual ACTION * Clone() const { return new API_ACTION(*this); }
87
88         virtual std::string ParamDescription() const { return m_description; }
89         virtual std::string DefaultDescription() const { return ""; }
90         virtual OPTION_BLOCK & Suboptions() { return m_suboptions; }
91         virtual PARSER_STATE Parse(int argc, char ** argv);
92
93     private:
94         COMMANDS & m_commands;
95         std::string m_description;
96         std::string m_argument;
97         OPTION_BLOCK m_suboptions;
98         std::map<std::string, std::string> m_params;
99         API_FUNCTION m_funPtr;
100 };
101
102 inline
103 ACTION * MakeAPIAction(COMMANDS & commands,
104                        const std::string & paramDescription,
105                        const std::vector<API_ACTION::PARAM> & params,
106                        API_FUNCTION funPtr)
107 {
108 return new API_ACTION(commands, paramDescription, true, params, funPtr);
109 }
110
111 inline
112 ACTION * MakeAPIAction(COMMANDS & commands,
113                        const std::string & paramDescription,
114                        API_FUNCTION funPtr)
115 {
116 return new API_ACTION(commands, paramDescription, true, funPtr);
117 }
118
119 inline
120 ACTION * MakeAPIAction(COMMANDS & commands,
121                        API_FUNCTION funPtr)
122 {
123 return new API_ACTION(commands, "", false, funPtr);
124 }
125
126 }
127
128 #endif