1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "cli/i2-cli.hpp"
7 #include "base/value.hpp"
8 #include "base/utility.hpp"
9 #include "base/type.hpp"
11 #include <boost/program_options.hpp>
16 std::vector<String> GetBashCompletionSuggestions(const String& type, const String& word);
17 std::vector<String> GetFieldCompletionSuggestions(const Type::Ptr& type, const String& word);
19 enum ImpersonationLevel
31 class CLICommand : public Object
34 DECLARE_PTR_TYPEDEFS(CLICommand);
36 typedef std::vector<String>(*ArgumentCompletionCallback)(const String&, const String&);
38 virtual String GetDescription() const = 0;
39 virtual String GetShortDescription() const = 0;
40 virtual int GetMinArguments() const;
41 virtual int GetMaxArguments() const;
42 virtual bool IsHidden() const;
43 virtual bool IsDeprecated() const;
44 virtual void InitParameters(boost::program_options::options_description& visibleDesc,
45 boost::program_options::options_description& hiddenDesc) const;
46 virtual ImpersonationLevel GetImpersonationLevel() const;
47 virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const = 0;
48 virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
49 virtual std::vector<String> GetPositionalSuggestions(const String& word) const;
51 static CLICommand::Ptr GetByName(const std::vector<String>& name);
52 static void Register(const std::vector<String>& name, const CLICommand::Ptr& command);
53 static void Unregister(const std::vector<String>& name);
55 static bool ParseCommand(int argc, char **argv, boost::program_options::options_description& visibleDesc,
56 boost::program_options::options_description& hiddenDesc,
57 boost::program_options::positional_options_description& positionalDesc,
58 boost::program_options::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete);
60 static void ShowCommands(int argc, char **argv,
61 boost::program_options::options_description *visibleDesc = nullptr,
62 boost::program_options::options_description *hiddenDesc = nullptr,
63 ArgumentCompletionCallback globalArgCompletionCallback = nullptr,
64 bool autocomplete = false, int autoindex = -1);
67 static boost::mutex& GetRegistryMutex();
68 static std::map<std::vector<String>, CLICommand::Ptr>& GetRegistry();
71 #define REGISTER_CLICOMMAND(name, klass) \
72 INITIALIZE_ONCE([]() { \
73 std::vector<String> vname = String(name).Split("/"); \
74 CLICommand::Register(vname, new klass()); \
79 #endif /* CLICOMMAND_H */