]> git.proxmox.com Git - proxmox.git/commitdiff
improve command line completion with optional argument parameters
authorDietmar Maurer <dietmar@proxmox.com>
Wed, 25 Mar 2020 09:37:22 +0000 (10:37 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Wed, 25 Mar 2020 09:52:13 +0000 (10:52 +0100)
proxmox/src/api/cli/completion.rs

index b529457579290e0b8c1f25519130306efdfab6bf..25573acd7e1d4fe141b3de3443cca4a23bf34a88 100644 (file)
@@ -73,30 +73,36 @@ fn get_simple_completion(
     arg_param: &[&str], // we remove done arguments
     args: &[String],
 ) -> Vec<String> {
-    // fixme: arg_param, fixed_param
     //eprintln!("COMPL: {:?} {:?} {}", arg_param, args, args.len());
 
     if !arg_param.is_empty() {
         let prop_name = arg_param[0];
-        if args.len() > 1 {
-            record_done_argument(done, cli_cmd.info.parameters, prop_name, &args[0]);
-            return get_simple_completion(cli_cmd, done, &arg_param[1..], &args[1..]);
-        }
+        if let Some((optional, schema)) = cli_cmd.info.parameters.lookup(prop_name) {
+            if optional && args[0].starts_with('-') {
+                // argument parameter is optional, and arg looks like an option,
+                // so assume its empty and complete the rest
+            } else {
+                record_done_argument(done, cli_cmd.info.parameters, prop_name, &args[0]);
+                if args.len() > 1 {
+                    return get_simple_completion(cli_cmd, done, &arg_param[1..], &args[1..]);
+                }
 
-        if args.len() == 1 {
-            record_done_argument(done, cli_cmd.info.parameters, prop_name, &args[0]);
-            if let Some((_, schema)) = cli_cmd.info.parameters.lookup(prop_name) {
-                return get_property_completion(
-                    schema,
-                    prop_name,
-                    &cli_cmd.completion_functions,
-                    &args[0],
-                    done,
-                );
+                if args.len() == 1 {
+                    return get_property_completion(
+                        schema,
+                        prop_name,
+                        &cli_cmd.completion_functions,
+                        &args[0],
+                        done,
+                    );
+                }
+
+                return Vec::new();
             }
+        } else {
+            // unknown arg_param - should never happen
+            return Vec::new();
         }
-
-        return Vec::new();
     }
     if args.is_empty() {
         return Vec::new();