]> git.stg.codes - stg.git/blob - projects/sgconf/api_action.h
Simplified module interfaces.
[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         API_ACTION(COMMANDS & commands,
65                    const std::string & paramDescription,
66                    bool needArgument,
67                    const OPTION_BLOCK& suboptions,
68                    API_FUNCTION funPtr)
69             : m_commands(commands),
70               m_description(paramDescription),
71               m_argument(needArgument ? "1" : ""), // Hack
72               m_suboptions(suboptions),
73               m_funPtr(funPtr)
74         {}
75         API_ACTION(COMMANDS & commands,
76                    const std::string & paramDescription,
77                    bool needArgument,
78                    API_FUNCTION funPtr)
79             : m_commands(commands),
80               m_description(paramDescription),
81               m_argument(needArgument ? "1" : ""), // Hack
82               m_funPtr(funPtr)
83         {}
84
85         virtual ACTION * Clone() const { return new API_ACTION(*this); }
86
87         virtual std::string ParamDescription() const { return m_description; }
88         virtual std::string DefaultDescription() const { return ""; }
89         virtual OPTION_BLOCK & Suboptions() { return m_suboptions; }
90         virtual PARSER_STATE Parse(int argc, char ** argv);
91
92     private:
93         COMMANDS & m_commands;
94         std::string m_description;
95         std::string m_argument;
96         OPTION_BLOCK m_suboptions;
97         std::map<std::string, std::string> m_params;
98         API_FUNCTION m_funPtr;
99 };
100
101 inline
102 ACTION * MakeAPIAction(COMMANDS & commands,
103                        const std::string & paramDescription,
104                        bool needArgument,
105                        API_FUNCTION funPtr)
106 {
107 return new API_ACTION(commands, paramDescription, needArgument, funPtr);
108 }
109
110 inline
111 ACTION * MakeAPIAction(COMMANDS & commands,
112                        API_FUNCTION funPtr)
113 {
114 return new API_ACTION(commands, "", false, funPtr);
115 }
116
117 }
118
119 #endif