You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ts...@apache.org on 2022/11/13 23:54:53 UTC

[camel] 02/03: CAMEL-18716: camel-jbang - Provide completion for positional file path parameters

This is an automated email from the ASF dual-hosted git repository.

tsato pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 16fd8cf65b46e0703dbe99d3ce4efb5eab5b4edb
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Sun Nov 13 21:49:11 2022 +0900

    CAMEL-18716: camel-jbang - Provide completion for positional file path parameters
---
 .../dsl/jbang/core/commands/CamelCommand.java      | 19 ++++++++++++++++
 .../apache/camel/dsl/jbang/core/commands/Pipe.java | 16 ++++++++++++-
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 26 +++++++++++++++++-----
 3 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
index acc543d0d41..ef5e1b44b67 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelCommand.java
@@ -17,9 +17,14 @@
 package org.apache.camel.dsl.jbang.core.commands;
 
 import java.io.File;
+import java.util.Stack;
 import java.util.concurrent.Callable;
 
 import picocli.CommandLine;
+import picocli.CommandLine.IParameterConsumer;
+import picocli.CommandLine.Model.ArgSpec;
+import picocli.CommandLine.Model.CommandSpec;
+import picocli.CommandLine.ParameterException;
 
 public abstract class CamelCommand implements Callable<Integer> {
 
@@ -63,4 +68,18 @@ public abstract class CamelCommand implements Callable<Integer> {
         return new File(camelDir, pid + "-output.json");
     }
 
+    protected abstract static class ParameterConsumer<T> implements IParameterConsumer {
+
+        @Override
+        public void consumeParameters(Stack<String> args, ArgSpec argSpec, CommandSpec cmdSpec) {
+            if (args.isEmpty()) {
+                throw new ParameterException(cmdSpec.commandLine(), "Error: missing required parameter");
+            }
+            T cmd = (T) cmdSpec.userObject();
+            doConsumeParameters(args, cmd);
+        }
+
+        protected abstract void doConsumeParameters(Stack<String> args, T cmd);
+    }
+
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java
index 247e84ff776..abe17f93f17 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Pipe.java
@@ -16,12 +16,18 @@
  */
 package org.apache.camel.dsl.jbang.core.commands;
 
+import java.nio.file.Path;
+import java.util.Stack;
+
 import picocli.CommandLine;
 
 @CommandLine.Command(name = "pipe", description = "Run Camel integration in pipe and filters mode for terminal scripting")
 class Pipe extends CamelCommand {
 
-    @CommandLine.Parameters(description = "Name of file", arity = "1")
+    @CommandLine.Parameters(description = "Name of file", arity = "1",
+                            paramLabel = "<file>", parameterConsumer = FileConsumer.class)
+    Path filePath; // Defined only for file path completion; the field never used
+
     String file;
 
     @CommandLine.Option(names = { "--max-messages" }, defaultValue = "0",
@@ -73,4 +79,12 @@ class Pipe extends CamelCommand {
         return run.runPipe(file);
     }
 
+    static class FileConsumer extends ParameterConsumer<Pipe> {
+        @Override
+        protected void doConsumeParameters(Stack<String> args, Pipe cmd) {
+            String arg = args.pop();
+            cmd.file = arg;
+        }
+    }
+
 }
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 59fec3a3f41..5ba66c71262 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -27,6 +27,7 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -35,6 +36,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
 import java.util.Set;
+import java.util.Stack;
 import java.util.StringJoiner;
 import java.util.function.Supplier;
 import java.util.regex.Matcher;
@@ -90,7 +92,9 @@ class Run extends CamelCommand {
 
     //CHECKSTYLE:OFF
     @Parameters(description = "The Camel file(s) to run. If no files specified then application.properties is used as source for which files to run.",
-                arity = "0..9")
+                arity = "0..9", paramLabel = "<files>", parameterConsumer = FilesConsumer.class)
+    Path[] filePaths; // Defined only for file path completion; the field never used
+
     String[] files;
 
     @Option(names = { "--profile" }, scope = CommandLine.ScopeType.INHERIT, defaultValue = "application",
@@ -101,20 +105,20 @@ class Run extends CamelCommand {
             "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate multiple dependencies)")
     String dependencies;
 
-    @Option(names = {"--repos"}, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)")
+    @Option(names = { "--repos" }, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)")
     String repos;
 
-    @Option(names = {"--maven-settings"}, description = "Optional location of maven setting.xml file to configure servers, repositories, mirrors and proxies." +
+    @Option(names = { "--maven-settings" }, description = "Optional location of maven setting.xml file to configure servers, repositories, mirrors and proxies." +
             " If set to \"false\", not even the default ~/.m2/settings.xml will be used.")
     String mavenSettings;
 
-    @Option(names = {"--maven-settings-security"}, description = "Optional location of maven settings-security.xml file to decrypt settings.xml")
+    @Option(names = { "--maven-settings-security" }, description = "Optional location of maven settings-security.xml file to decrypt settings.xml")
     String mavenSettingsSecurity;
 
     @Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources")
     boolean fresh;
 
-    @Option(names = {"--download"}, defaultValue = "true", description = "Whether to allow automatic downloading JAR dependencies (over the internet)")
+    @Option(names = { "--download" }, defaultValue = "true", description = "Whether to allow automatic downloading JAR dependencies (over the internet)")
     boolean download = true;
 
     @Option(names = { "--name" }, defaultValue = "CamelJBang", description = "The name of the Camel application")
@@ -848,4 +852,16 @@ class Run extends CamelCommand {
         }
     }
 
+    static class FilesConsumer extends ParameterConsumer<Run> {
+        @Override
+        protected void doConsumeParameters(Stack<String> args, Run cmd) {
+            List<String> files = new ArrayList<>();
+            while (!args.isEmpty()) {
+                String arg = args.pop();
+                files.add(arg);
+            }
+            cmd.files = files.toArray(String[]::new);
+        }
+    }
+
 }