]> granicus.if.org Git - icinga2/commitdiff
Implement auto-completion for positional arguments
authorGunnar Beutner <gunnar@beutner.name>
Fri, 17 Oct 2014 13:54:46 +0000 (15:54 +0200)
committerGunnar Beutner <gunnar@beutner.name>
Fri, 17 Oct 2014 13:54:46 +0000 (15:54 +0200)
refs #7255

26 files changed:
etc/bash_completion.d/icinga2
icinga-app/icinga.cpp
lib/base/clicommand.cpp
lib/base/clicommand.hpp
lib/cli/daemoncommand.cpp
lib/cli/daemoncommand.hpp
lib/cli/featuredisablecommand.cpp
lib/cli/featuredisablecommand.hpp
lib/cli/featureenablecommand.cpp
lib/cli/featureenablecommand.hpp
lib/cli/featurelistcommand.cpp
lib/cli/featurelistcommand.hpp
lib/cli/objectlistcommand.cpp
lib/cli/objectlistcommand.hpp
lib/cli/pkinewcacommand.cpp
lib/cli/pkinewcacommand.hpp
lib/cli/pkinewcertcommand.cpp
lib/cli/pkinewcertcommand.hpp
lib/cli/pkirequestcommand.cpp
lib/cli/pkirequestcommand.hpp
lib/cli/pkisigncsrcommand.cpp
lib/cli/pkisigncsrcommand.hpp
lib/cli/pkiticketcommand.cpp
lib/cli/pkiticketcommand.hpp
lib/cli/repositoryobjectcommand.cpp
lib/cli/repositoryobjectcommand.hpp

index 1b9013e86d417c88179d789c12fde83847728689..5c49ab0361fec83fcb05fcaf04fe23372bf33c41 100644 (file)
@@ -4,7 +4,12 @@ _icinga2()
   opts="${COMP_WORDS[*]}"
   cur="${COMP_WORDS[COMP_CWORD]}"
   COMPREPLY=($(icinga2 --autocomplete $COMP_CWORD ${COMP_WORDS[*]} < /dev/null))
-  [[ $COMPREPLY = */ ]] && compopt -o nospace
+  case $COMPREPLY in
+    */|*=)
+      compopt -o nospace
+      ;;
+  esac
+
   return 0
 }
 
index 385d764f006461d5c3f9c063d8b2525b30ae10d1..9b37a2e61d735b47797992aef7cb97921002a3c2 100644 (file)
@@ -48,7 +48,7 @@ SERVICE_STATUS l_SvcStatus;
 SERVICE_STATUS_HANDLE l_SvcStatusHandle;
 #endif /* _WIN32 */
 
-static std::vector<String> LogLevelCompletion(const String& arg)
+static std::vector<String> GetLogLevelCompletionSuggestions(const String& arg)
 {
        std::vector<String> result;
        
@@ -75,6 +75,16 @@ static std::vector<String> LogLevelCompletion(const String& arg)
        return result;
 }
 
+static std::vector<String> GlobalArgumentCompletion(const String& argument, const String& word)
+{
+       if (argument == "include")
+               return GetBashCompletionSuggestions("directory", word);
+       else if (argument == "log-level")
+               return GetLogLevelCompletionSuggestions(word);
+       else
+               return std::vector<String>();
+}
+
 int Main(void)
 {
        int argc = Application::GetArgC();
@@ -170,16 +180,13 @@ int Main(void)
        po::positional_options_description positionalDesc;
        positionalDesc.add("arg", -1);
 
-       ArgumentCompletionDescription argDesc;
-       argDesc["include"] = BashArgumentCompletion("directory");
-       argDesc["log-level"] = LogLevelCompletion;
-       
        String cmdname;
        CLICommand::Ptr command;
        po::variables_map vm;
 
        try {
-               CLICommand::ParseCommand(argc, argv, visibleDesc, hiddenDesc, positionalDesc, argDesc, vm, cmdname, command, autocomplete);
+               CLICommand::ParseCommand(argc, argv, visibleDesc, hiddenDesc, positionalDesc,
+                   vm, cmdname, command, autocomplete);
        } catch (const std::exception& ex) {
                std::ostringstream msgbuf;
                msgbuf << "Error while parsing command-line options: " << ex.what();
@@ -307,7 +314,8 @@ int Main(void)
        int rc = 1;
 
        if (autocomplete) {
-               CLICommand::ShowCommands(argc, argv, &visibleDesc, &hiddenDesc, &argDesc, true, autoindex);
+               CLICommand::ShowCommands(argc, argv, &visibleDesc, &hiddenDesc,
+                   &GlobalArgumentCompletion, true, autoindex);
                rc = 0;
        } else if (command) {
 #ifndef _WIN32
index 3e52024cee667bbecd0f228cdadb20bf8029a618..a2aed63f2ff203fa97b5995c14dfd9198143a553 100644 (file)
@@ -34,12 +34,12 @@ namespace po = boost::program_options;
 boost::mutex l_RegistryMutex;
 std::map<std::vector<String>, CLICommand::Ptr> l_Registry;
 
-static std::vector<String> BashArgumentCompletionHelper(const String& type, const String& arg)
+std::vector<String> icinga::GetBashCompletionSuggestions(const String& type, const String& word)
 {
        std::vector<String> result;
 
 #ifndef _WIN32
-       String bashArg = "compgen -A " + Utility::EscapeShellArg(type) + " " + Utility::EscapeShellArg(arg);
+       String bashArg = "compgen -A " + Utility::EscapeShellArg(type) + " " + Utility::EscapeShellArg(word);
        String cmd = "bash -c " + Utility::EscapeShellArg(bashArg);
 
        FILE *fp = popen(cmd.CStr(), "r");
@@ -69,25 +69,28 @@ static std::vector<String> BashArgumentCompletionHelper(const String& type, cons
        return result;
 }
 
-void icinga::AddTypeFields(const Type *type, boost::program_options::options_description& desc)
+std::vector<String> icinga::GetFieldCompletionSuggestions(const Type *type, const String& word)
 {
+       std::vector<String> result;
+
        for (int i = 0; i < type->GetFieldCount(); i++) {
                Field field = type->GetFieldInfo(i);
 
-               if (strcmp(field.Name, "__name") == 0)
+               if (!(field.Attributes & FAConfig))
                        continue;
 
-               if (!(field.Attributes & FAConfig))
+               String fname = field.Name;
+
+               if (fname == "__name" || fname == "templates")
                        continue;
 
-               desc.add_options()
-                       (field.Name, po::value<std::string>(), field.Name);
+               String suggestion = fname + "=";
+
+               if (suggestion.Find(word) == 0)
+                       result.push_back(suggestion);
        }
-}
 
-ArgumentCompletionCallback icinga::BashArgumentCompletion(const String& type)
-{
-       return boost::bind(BashArgumentCompletionHelper, type, _1);
+       return result;
 }
 
 CLICommand::Ptr CLICommand::GetByName(const std::vector<String>& name)
@@ -121,10 +124,23 @@ RegisterCLICommandHelper::RegisterCLICommandHelper(const String& name, const CLI
        CLICommand::Register(vname, command);
 }
 
+std::vector<String> CLICommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+       return std::vector<String>();
+}
+
+std::vector<String> CLICommand::GetPositionalSuggestions(const String& word) const
+{
+       return std::vector<String>();
+}
+
+void CLICommand::InitParameters(boost::program_options::options_description& visibleDesc,
+    boost::program_options::options_description& hiddenDesc) const
+{ }
+
 bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& visibleDesc,
     po::options_description& hiddenDesc,
     po::positional_options_description& positionalDesc,
-    ArgumentCompletionDescription& argCompletionDesc,
     po::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete)
 {
        boost::mutex::scoped_lock lock(l_RegistryMutex);
@@ -164,7 +180,7 @@ found_command:
        po::options_description vdesc("Command options");
 
        if (command)
-               command->InitParameters(vdesc, hiddenDesc, argCompletionDesc);
+               command->InitParameters(vdesc, hiddenDesc);
 
        visibleDesc.add(vdesc);
 
@@ -182,7 +198,8 @@ found_command:
 }
 
 void CLICommand::ShowCommands(int argc, char **argv, po::options_description *visibleDesc,
-    po::options_description *hiddenDesc, ArgumentCompletionDescription *argCompletionDesc,
+    po::options_description *hiddenDesc,
+    ArgumentCompletionCallback globalArgCompletionCallback,
     bool autocomplete, int autoindex)
 {
        boost::mutex::scoped_lock lock(l_RegistryMutex);
@@ -263,7 +280,6 @@ void CLICommand::ShowCommands(int argc, char **argv, po::options_description *vi
 
        if (command && autocomplete) {
                String aname, prefix, pword;
-               ArgumentCompletionDescription::const_iterator it;
                const po::option_description *odesc;
        
                if (autoindex - 2 >= 0 && strcmp(argv[autoindex - 1], "=") == 0 && strstr(argv[autoindex - 2], "--") == argv[autoindex - 2]) {
@@ -290,13 +306,12 @@ void CLICommand::ShowCommands(int argc, char **argv, po::options_description *vi
 
                if (odesc->semantic()->min_tokens() == 0)
                        goto complete_option;
-                       
-               it = argCompletionDesc->find(odesc->long_name());
-               
-               if (it == argCompletionDesc->end())
-                       return;
-               
-               BOOST_FOREACH(const String& suggestion, it->second(pword)) {
+
+               BOOST_FOREACH(const String& suggestion, globalArgCompletionCallback(aname, pword)) {
+                       std::cout << prefix << suggestion << "\n";
+               }
+
+               BOOST_FOREACH(const String& suggestion, command->GetArgumentSuggestions(aname, pword)) {
                        std::cout << prefix << suggestion << "\n";
                }
                
@@ -309,6 +324,10 @@ complete_option:
                        if (cname.Find(aword) == 0)
                                std::cout << cname << "\n";
                }
+
+               BOOST_FOREACH(const String& suggestion, command->GetPositionalSuggestions(aword)) {
+                       std::cout << suggestion << "\n";
+               }
        }
 
        return;
index a75dc85e8e1476e4f70b659f7c4a341ed4f999ac..a324681cbe116ac7ce07f7d74716f693514be6a6 100644 (file)
 namespace icinga
 {
 
-typedef boost::function<std::vector<String> (const String&)> ArgumentCompletionCallback;
-typedef std::map<String, ArgumentCompletionCallback> ArgumentCompletionDescription;
-
-I2_BASE_API ArgumentCompletionCallback BashArgumentCompletion(const String& type);
-I2_BASE_API void AddTypeFields(const Type *type, boost::program_options::options_description& desc);
+I2_BASE_API std::vector<String> GetBashCompletionSuggestions(const String& type, const String& word);
+I2_BASE_API std::vector<String> GetFieldCompletionSuggestions(const Type *type, const String& word);
 
 /**
  * A CLI command.
@@ -45,12 +42,15 @@ class I2_BASE_API CLICommand : public Object
 public:
        DECLARE_PTR_TYPEDEFS(CLICommand);
 
+       typedef std::vector<String>(*ArgumentCompletionCallback)(const String&, const String&);
+
        virtual String GetDescription(void) const = 0;
        virtual String GetShortDescription(void) const = 0;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const = 0;
+           boost::program_options::options_description& hiddenDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const = 0;
+       virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
+       virtual std::vector<String> GetPositionalSuggestions(const String& word) const;
 
        static CLICommand::Ptr GetByName(const std::vector<String>& name);
        static void Register(const std::vector<String>& name, const CLICommand::Ptr& command);
@@ -59,14 +59,13 @@ public:
        static bool ParseCommand(int argc, char **argv, boost::program_options::options_description& visibleDesc,
            boost::program_options::options_description& hiddenDesc,
            boost::program_options::positional_options_description& positionalDesc,
-           ArgumentCompletionDescription& argCompletionDesc,
            boost::program_options::variables_map& vm, String& cmdname,
           CLICommand::Ptr& command, bool autocomplete);
 
        static void ShowCommands(int argc, char **argv,
            boost::program_options::options_description *visibleDesc = NULL,
            boost::program_options::options_description *hiddenDesc = NULL,
-           ArgumentCompletionDescription *argCompletionDesc = NULL,
+           ArgumentCompletionCallback globalArgCompletionCallback = NULL,
            bool autocomplete = false, int autoindex = -1);
 };
 
index f53e972f4f9a9fe89869898d873ed4f769189293..735566283f139702fc19be90fbc27bfa94d285b0 100644 (file)
@@ -276,8 +276,7 @@ String DaemonCommand::GetShortDescription(void) const
 }
 
 void DaemonCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
                ("config,c", po::value<std::vector<std::string> >(), "parse a configuration file")
@@ -293,9 +292,14 @@ void DaemonCommand::InitParameters(boost::program_options::options_description&
        hiddenDesc.add_options()
                ("reload-internal", po::value<int>(), "used internally to implement config reload: do not call manually, send SIGHUP instead");
 #endif /* _WIN32 */
+}
 
-       argCompletionDesc["config"] = BashArgumentCompletion("file");
-       argCompletionDesc["errorlog"] = BashArgumentCompletion("file");
+std::vector<String> DaemonCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+       if (argument == "config" || argument == "errorlog")
+               return GetBashCompletionSuggestions("file", word);
+       else
+               return CLICommand::GetArgumentSuggestions(argument, word);
 }
 
 /**
index 3341bcb30feb0c9755131d69f9a5d2d8c76f1b9b..14550ecc02f18702bc80362b12504a94d542d6e7 100644 (file)
@@ -40,8 +40,8 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
+       virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 };
 
index 530ed21e79380bd57f69d251cc0083cc9da4141b..79473db23412525d148101dc6eefb103e374be19 100644 (file)
@@ -45,8 +45,7 @@ String FeatureDisableCommand::GetShortDescription(void) const
 }
 
 void FeatureDisableCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        /* Command doesn't support any parameters. */
 }
index 32d9e8c4d8fa97f239a022ee9ef7c6fe5bdda900..fcb6f783989402259ab6e3c90a9e39722db91706 100644 (file)
@@ -39,8 +39,7 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index c5f357e9065e53e6d0413ab133c3225ff8f0fd9e..642924bacb9454fa1698eb3e61877d29006eaf25 100644 (file)
@@ -45,8 +45,7 @@ String FeatureEnableCommand::GetShortDescription(void) const
 }
 
 void FeatureEnableCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        /* Command doesn't support any parameters. */
 }
index 529afba607706a2b37797805d68169ce6f956cf2..e675fe4657ef949ea8a7f253142bc31c80591a9f 100644 (file)
@@ -39,8 +39,7 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index ed40ddb851f2ce693ecca0006796382858a92810..a9aa9d6851c47c28c851fa840c131432d59943fe 100644 (file)
@@ -44,13 +44,6 @@ String FeatureListCommand::GetShortDescription(void) const
        return "lists all enabled features";
 }
 
-void FeatureListCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
-{
-       /* Command doesn't support any parameters. */
-}
-
 /**
  * The entry point for the "feature list" CLI command.
  *
index 272b0d0ed48859cf852c1e9606ce880147289ddb..399bf3c69f3e1e4e563fcf52f027b641f6433886 100644 (file)
@@ -38,9 +38,6 @@ public:
 
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
-       virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 private:
index d70324580de17b8628b9a51bb756a0ba9249be1e..76ec05a8be7e11fb1c63e8cab01bf9cbbb4ec701 100644 (file)
@@ -51,8 +51,7 @@ String ObjectListCommand::GetShortDescription(void) const
 }
 
 void ObjectListCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
                ("count,c", "display object counts by types")
index fdcca070a7aaa56414f863ab511c70a163c6ec3d..2e191362df018e118bd42f9203f5b118670ffa90 100644 (file)
@@ -42,8 +42,7 @@ public:
         virtual String GetDescription(void) const;
         virtual String GetShortDescription(void) const;
         virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-            boost::program_options::options_description& hiddenDesc,
-            ArgumentCompletionDescription& argCompletionDesc) const;
+            boost::program_options::options_description& hiddenDesc) const;
         virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 private:
index 71ee57cb1bbded9d72b3f1cb66d1169e7495baa3..373ab7d49ce8ec4e3e36be0c2da50d46a0edbec0 100644 (file)
@@ -38,13 +38,6 @@ String PKINewCACommand::GetShortDescription(void) const
        return "sets up a new CA";
 }
 
-void PKINewCACommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
-{
-       /* Command doesn't support any parameters. */
-}
-
 /**
  * The entry point for the "pki new-ca" CLI command.
  *
index e063f70b8635754c5eaf8e4ff63ca5f53342f1a4..6a6cf45c0f7a776b0f31dfab607dda04aef112b5 100644 (file)
@@ -38,9 +38,6 @@ public:
 
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
-       virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index 012f31994d8d338966fc2d73755f204faa3b197b..fac38fd62da3045335b15d706a77f7b731c2eb43 100644 (file)
@@ -38,18 +38,21 @@ String PKINewCertCommand::GetShortDescription(void) const
 }
 
 void PKINewCertCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
                ("cn", po::value<std::string>(), "Common Name")
                ("keyfile", po::value<std::string>(), "Key file path (output")
                ("csrfile", po::value<std::string>(), "CSR file path (optional, output)")
                ("certfile", po::value<std::string>(), "Certificate file path (optional, output)");
+}
 
-       argCompletionDesc["keyfile"] = BashArgumentCompletion("file");
-       argCompletionDesc["csrfile"] = BashArgumentCompletion("file");
-       argCompletionDesc["certfile"] = BashArgumentCompletion("file");
+std::vector<String> PKINewCertCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+       if (argument == "keyfile" || argument == "csrfile" || argument == "certfile")
+               return GetBashCompletionSuggestions("file", word);
+       else
+               return CLICommand::GetArgumentSuggestions(argument, word);
 }
 
 /**
index 98f356a5e2e6a31e110074566b0e1f88f22421ab..bff677274d69997f266803bc443c7a0c35057e2c 100644 (file)
@@ -39,8 +39,8 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
+       virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index 04ddd61e0f6a657880bc6ed938b5de27db0e7d4c..f238197f879846d156ca11dfbfc6744f5414fd4c 100644 (file)
@@ -44,8 +44,7 @@ String PKIRequestCommand::GetShortDescription(void) const
 }
 
 void PKIRequestCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
            ("keyfile", po::value<std::string>(), "Key file path")
@@ -54,12 +53,18 @@ void PKIRequestCommand::InitParameters(boost::program_options::options_descripti
            ("host", po::value<std::string>(), "Icinga 2 host")
            ("port", po::value<std::string>(), "Icinga 2 port")
            ("ticket", po::value<std::string>(), "Icinga 2 PKI ticket");
+}
 
-       argCompletionDesc["keyfile"] = BashArgumentCompletion("file");
-       argCompletionDesc["certfile"] = BashArgumentCompletion("file");
-       argCompletionDesc["cafile"] = BashArgumentCompletion("file");
-       argCompletionDesc["host"] = BashArgumentCompletion("hostname");
-       argCompletionDesc["port"] = BashArgumentCompletion("service");
+std::vector<String> PKIRequestCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+       if (argument == "keyfile" || argument == "certfile" || argument == "cafile")
+               return GetBashCompletionSuggestions("file", word);
+       else if (argument == "host")
+               return GetBashCompletionSuggestions("hostname", word);
+       else if (argument == "port")
+               return GetBashCompletionSuggestions("service", word);
+       else
+               return CLICommand::GetArgumentSuggestions(argument, word);
 }
 
 /**
index 357ded707dda75cbccfb71bd28d692981499ab02..439548980df8a095a8a2638cccc237c1cbf9145b 100644 (file)
@@ -39,8 +39,8 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
+       virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index a6b2ed09b3a35ed50b44e22530f6f75a7ede853f..c69622ff1c09e737eebfa636f0b1288e0fa9054c 100644 (file)
@@ -40,15 +40,19 @@ String PKISignCSRCommand::GetShortDescription(void) const
 }
 
 void PKISignCSRCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
            ("csrfile", po::value<std::string>(), "CSR file path (input)")
            ("certfile", po::value<std::string>(), "Certificate file path (output)");
+}
 
-       argCompletionDesc["csrfile"] = BashArgumentCompletion("file");
-       argCompletionDesc["certfile"] = BashArgumentCompletion("file");
+std::vector<String> PKISignCSRCommand::GetArgumentSuggestions(const String& argument, const String& word) const
+{
+       if (argument == "csrfile" || argument == "certfile")
+               return GetBashCompletionSuggestions("file", word);
+       else
+               return CLICommand::GetArgumentSuggestions(argument, word);
 }
 
 /**
index 9d4c4ba2fd3709c8accb257fbe9a1aad51ba81e7..f38bb6bce341bcfba1477824165212afba15539d 100644 (file)
@@ -39,8 +39,8 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
+       virtual std::vector<String> GetArgumentSuggestions(const String& argument, const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index 7cb8b61d94ec16decd5e4606502f4d1ced26500f..2dc2932e181764aec457e54922beec94c42fe47d 100644 (file)
@@ -44,8 +44,7 @@ String PKITicketCommand::GetShortDescription(void) const
 }
 
 void PKITicketCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
            ("cn", po::value<std::string>(), "Certificate common name")
index ee25b5973a3162feb8e205c59f903aaef4aec58f..36fbc64714984088a549b6e12fc5c8bc8772d1d5 100644 (file)
@@ -39,8 +39,7 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 };
index db999e135277548b661c4a637c4ea4ab6f111580..7b19d0fd80fabc570f076e3b7c86ccf523f19c53 100644 (file)
@@ -103,17 +103,17 @@ String RepositoryObjectCommand::GetShortDescription(void) const
 }
 
 void RepositoryObjectCommand::InitParameters(boost::program_options::options_description& visibleDesc,
-    boost::program_options::options_description& hiddenDesc,
-    ArgumentCompletionDescription& argCompletionDesc) const
+    boost::program_options::options_description& hiddenDesc) const
 {
        visibleDesc.add_options()
                ("name", po::value<std::string>(), "The name of the object");
+}
 
-       if (m_Command == RepositoryCommandAdd) {
-               const Type *ptype = Type::GetByName(m_Type);
-               ASSERT(ptype);
-               AddTypeFields(ptype, visibleDesc);
-       }
+std::vector<String> RepositoryObjectCommand::GetPositionalSuggestions(const String& word) const
+{
+       const Type *ptype = Type::GetByName(m_Type);
+       ASSERT(ptype);
+       return GetFieldCompletionSuggestions(ptype, word);
 }
 
 /**
index 03600d83ecf3e5b9775656c76fd1e30e06a947bf..625d2ca262ddd94fc80f5dd160c3891ed7e0050a 100644 (file)
@@ -48,8 +48,8 @@ public:
        virtual String GetDescription(void) const;
        virtual String GetShortDescription(void) const;
        virtual void InitParameters(boost::program_options::options_description& visibleDesc,
-           boost::program_options::options_description& hiddenDesc,
-           ArgumentCompletionDescription& argCompletionDesc) const;
+           boost::program_options::options_description& hiddenDesc) const;
+       virtual std::vector<String> GetPositionalSuggestions(const String& word) const;
        virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
 
 private: