JAL-629 More consistent printing of --arguments. Example nf-core argfile
[jalview.git] / src / jalview / bin / argparser / Arg.java
index 092f5d2..7eaac09 100644 (file)
@@ -1,29 +1,32 @@
 package jalview.bin.argparser;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.Locale;
+import java.util.stream.Collectors;
 
 public enum Arg
 {
   HELP("h"), CALCULATION, MENUBAR, STATUS, SHOWOVERVIEW, ANNOTATIONS,
   COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, ANNOTATION,
-  ANNOTATION2, DISPLAY, GUI, NEWS, NOQUESTIONNAIRE, SORTBYTREE, USAGESTATS,
-  OPEN, OPEN2, PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT,
-  OUTPUTTYPE, SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC,
+  ANNOTATION2, DISPLAY, GUI, NEWS, SORTBYTREE, USAGESTATS, OPEN, OPENNEW,
+  PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT, OUTPUTTYPE,
+  SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC,
   TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, IMAGE,
   QUIT, CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, INCREMENT, NPP("n++"),
-  SUBSTITUTIONS, NIL;
+  SUBSTITUTIONS, INITSUBSTITUTIONS, NIL, SPLASH, SETARGFILE, UNSETARGFILE;
 
   protected static enum Opt
   {
     BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
-    GLOB, NOACTION, ALLOWSUBSTITUTIONS
+    GLOB, NOACTION, ALLOWSUBSTITUTIONS, PRIVATE
   }
 
   static
   {
     HELP.setOptions(Opt.UNARY);
     CALCULATION.setOptions(true, Opt.BOOLEAN); // default "true" implies only
-                                               // expecting "--nocalculation"
+    // expecting "--nocalculation"
     MENUBAR.setOptions(true, Opt.BOOLEAN);
     STATUS.setOptions(true, Opt.BOOLEAN);
     SHOWOVERVIEW.setOptions(Opt.UNARY, Opt.LINKED);
@@ -40,17 +43,18 @@ public enum Arg
     ANNOTATION2.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
     DISPLAY.setOptions(true, Opt.BOOLEAN);
     GUI.setOptions(true, Opt.BOOLEAN);
-    NEWS.setOptions(true, Opt.BOOLEAN);
-    NOQUESTIONNAIRE.setOptions(Opt.UNARY); // unary as --questionnaire=val
-                                           // expects a string value
+    NEWS.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
+    SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
+    // expects a string value
     SORTBYTREE.setOptions(true, Opt.BOOLEAN);
     USAGESTATS.setOptions(true, Opt.BOOLEAN);
     OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
             Opt.ALLOWSUBSTITUTIONS);
-    OPEN2.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
+    OPENNEW.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
+            Opt.ALLOWSUBSTITUTIONS);
     PROPS.setOptions(Opt.STRING, Opt.BOOTSTRAP);
-    QUESTIONNAIRE.setOptions(Opt.STRING);
-    SETPROP.setOptions(Opt.STRING);
+    QUESTIONNAIRE.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
+    SETPROP.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP);
     TREE.setOptions(Opt.STRING);
 
     VDOC.setOptions(Opt.UNARY);
@@ -82,11 +86,15 @@ public enum Arg
     INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
     NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
     SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION);
+    INITSUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP, Opt.NOACTION);
     NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION);
-    // BOOTSTRAP args are parsed before a full parse of arguments and
-    // so are accessible at an earlier stage to (e.g.) set debug log level,
-    // provide a props file (that might set log level), run headlessly, read
-    // an argfile instead of other args.
+    SETARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
+    UNSETARGFILE.setOptions(Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
+    // Opt.BOOTSTRAP args are parsed (not linked with no SubVals so using a
+    // simplified parser, see jalview.bin.argparser.BootstrapArgs)
+    // before a full parse of arguments and so can be accessible at an earlier
+    // stage to (e.g.) set debug log level, provide a props file (that might set
+    // log level), run headlessly, read an argfile instead of other args.
   }
 
   private final String[] argNames;
@@ -95,29 +103,6 @@ public enum Arg
 
   private boolean defaultBoolValue = false;
 
-  public String toLongString()
-  {
-    StringBuilder sb = new StringBuilder();
-    sb.append("Arg: ").append(this.name());
-    for (String name : getNames())
-    {
-      sb.append(", '").append(name).append("'");
-    }
-    sb.append("\nOptions: ");
-    boolean first = true;
-    for (Opt o : argOptions)
-    {
-      if (!first)
-      {
-        sb.append(", ");
-      }
-      sb.append(o.toString());
-      first = false;
-    }
-    sb.append("\n");
-    return sb.toString();
-  }
-
   private Arg()
   {
     this(new String[0]);
@@ -134,6 +119,32 @@ public enum Arg
       System.arraycopy(names, 0, this.argNames, 1, names.length);
   }
 
+  public String argString()
+  {
+    return new StringBuilder(ArgParser.DOUBLEDASH).append(getName())
+            .toString();
+  }
+
+  public String toLongString()
+  {
+    StringBuilder sb = new StringBuilder();
+    sb.append(this.getClass().getName()).append('.').append(this.name());
+    sb.append('(');
+    if (getNames().length > 0)
+      sb.append('"');
+    sb.append(String.join("\", \"", getNames()));
+    if (getNames().length > 0)
+      sb.append('"');
+    sb.append(")\n");
+    sb.append("\nOpt: ");
+    // map List<Opt> to List<String> for the String.join
+    List<String> optList = Arrays.asList(argOptions).stream()
+            .map(opt -> opt.name()).collect(Collectors.toList());
+    sb.append(String.join(", ", optList));
+    sb.append("\n");
+    return sb.toString();
+  }
+
   public String[] getNames()
   {
     return argNames;