package jalview.bin.argparser;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.EnumSet;
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, 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, SPLASH;
+ COLOUR, FEATURES, GROOVY, GROUPS, HEADLESS, JABAWS, DISPLAY, GUI, NEWS,
+ SORTBYTREE, USAGESTATS, APPEND, OPEN, PROPS, QUESTIONNAIRE, SETPROP, TREE,
+ VDOC, VSESS, OUTPUT, OUTPUTTYPE, SSANNOTATIONS, NOTEMPFAC, TEMPFAC, TITLE,
+ PAEMATRIX, WRAP, NOSTRUCTURE, STRUCTURE, STRUCTUREVIEWER, IMAGE, QUIT,
+ CLOSE, DEBUG("d"), QUIET("q"), ARGFILE, NEWFRAME, NPP("n++"),
+ SUBSTITUTIONS, INITSUBSTITUTIONS, NIL, SPLASH, SETARGFILE, UNSETARGFILE,
+ WEBSERVICEDISCOVERY;
protected static enum Opt
{
BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
- GLOB, NOACTION, ALLOWSUBSTITUTIONS
+ GLOB, NOACTION, ALLOWSUBSTITUTIONS, PRIVATE
}
static
{
- HELP.setOptions(Opt.UNARY);
+ HELP.setOptions("Display this help message", Opt.UNARY, Opt.BOOTSTRAP);
CALCULATION.setOptions(true, Opt.BOOLEAN); // default "true" implies only
// expecting "--nocalculation"
MENUBAR.setOptions(true, Opt.BOOLEAN);
STATUS.setOptions(true, Opt.BOOLEAN);
SHOWOVERVIEW.setOptions(Opt.UNARY, Opt.LINKED);
- ANNOTATIONS.setOptions(Opt.STRING, Opt.LINKED);
+ ANNOTATIONS.setOptions(Opt.BOOLEAN, Opt.LINKED);
COLOUR.setOptions(Opt.STRING, Opt.LINKED);
FEATURES.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
Opt.ALLOWSUBSTITUTIONS);
GROUPS.setOptions(Opt.STRING, Opt.LINKED);
HEADLESS.setOptions(Opt.UNARY, Opt.BOOTSTRAP);
JABAWS.setOptions(Opt.STRING);
- ANNOTATION.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
- ANNOTATION2.setOptions(true, Opt.BOOLEAN, Opt.LINKED);
DISPLAY.setOptions(true, Opt.BOOLEAN);
GUI.setOptions(true, Opt.BOOLEAN);
NEWS.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
SPLASH.setOptions(true, Opt.BOOLEAN, Opt.BOOTSTRAP);
- NOQUESTIONNAIRE.setOptions(Opt.UNARY, Opt.BOOTSTRAP); // unary as
- // --questionnaire=val
// expects a string value
SORTBYTREE.setOptions(true, Opt.BOOLEAN);
USAGESTATS.setOptions(true, Opt.BOOLEAN);
- OPEN.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
+ APPEND.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
Opt.ALLOWSUBSTITUTIONS);
- OPENNEW.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI, Opt.GLOB,
+ OPEN.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);
OUTPUT.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
OUTPUTTYPE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI);
- SSANNOTATION.setOptions(Opt.BOOLEAN, Opt.LINKED);
+ SSANNOTATIONS.setOptions(Opt.BOOLEAN, Opt.LINKED);
NOTEMPFAC.setOptions(Opt.UNARY, Opt.LINKED);
TEMPFAC.setOptions(Opt.STRING, Opt.LINKED);
- TEMPFAC_LABEL.setOptions(Opt.STRING, Opt.LINKED);
- TEMPFAC_DESC.setOptions(Opt.STRING, Opt.LINKED);
- TEMPFAC_SHADING.setOptions(Opt.BOOLEAN, Opt.LINKED);
TITLE.setOptions(Opt.STRING, Opt.LINKED);
PAEMATRIX.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
Opt.ALLOWSUBSTITUTIONS);
NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED);
STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI,
Opt.ALLOWSUBSTITUTIONS);
+ STRUCTUREVIEWER.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI);
WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED);
IMAGE.setOptions(Opt.STRING, Opt.LINKED, Opt.ALLOWSUBSTITUTIONS);
QUIT.setOptions(Opt.UNARY);
QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP);
ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB,
Opt.ALLOWSUBSTITUTIONS);
- INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
+ NEWFRAME.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);
+ SETARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
+ UNSETARGFILE.setOptions(Opt.MULTI, Opt.PRIVATE, Opt.NOACTION);
+ WEBSERVICEDISCOVERY.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
// 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
private boolean defaultBoolValue = false;
+ private String description = null;
+
private Arg()
{
this(new String[0]);
System.arraycopy(names, 0, this.argNames, 1, names.length);
}
+ public String argString()
+ {
+ return argString(false);
+ }
+
+ public String negateArgString()
+ {
+ return argString(true);
+ }
+
+ private String argString(boolean negate)
+ {
+ StringBuilder sb = new StringBuilder(ArgParser.DOUBLEDASH);
+ if (negate && hasOption(Opt.BOOLEAN))
+ sb.append(ArgParser.NEGATESTRING);
+ sb.append(getName());
+ return sb.toString();
+ }
+
public String toLongString()
{
StringBuilder sb = new StringBuilder();
protected void setOptions(Opt... options)
{
- setOptions(false, options);
+ setOptions("", false, options);
+ }
+
+ protected void setOptions(String desc, Opt... options)
+ {
+ setOptions(desc, false, options);
}
protected void setOptions(boolean defaultBoolValue, Opt... options)
{
+ setOptions("", defaultBoolValue, options);
+ }
+
+ protected void setOptions(String desc, boolean defaultBoolValue,
+ Opt... options)
+ {
+ this.description = desc;
this.defaultBoolValue = defaultBoolValue;
- argOptions = options;
+ this.argOptions = options;
}
protected boolean getDefaultBoolValue()
{
return defaultBoolValue;
}
-}
+
+ private void setDescription(String d)
+ {
+ description = d;
+ }
+
+ protected String getDescription()
+ {
+ return description;
+ }
+
+ public static String booleanArgString(Arg a)
+ {
+ StringBuilder sb = new StringBuilder(a.argString());
+ if (a.hasOption(Opt.BOOLEAN))
+ {
+ sb.append('/');
+ sb.append(a.negateArgString());
+ }
+ return sb.toString();
+ }
+
+ public static final String usage()
+ {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("Usage: jalview [args]");
+ sb.append(System.lineSeparator());
+
+ int maxArgLength = 0;
+ for (Arg a : EnumSet.allOf(Arg.class))
+ {
+ if (a.hasOption(Opt.PRIVATE))
+ continue;
+ StringBuilder argSb = new StringBuilder();
+ argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a)
+ : a.argString());
+ if (a.hasOption(Opt.STRING))
+ argSb.append("=value");
+ if (argSb.length() > maxArgLength)
+ maxArgLength = argSb.length();
+ }
+
+ // might want to sort these
+ for (Arg a : EnumSet.allOf(Arg.class))
+ {
+ if (a.hasOption(Opt.PRIVATE))
+ continue;
+ StringBuilder argSb = new StringBuilder();
+ argSb.append(a.hasOption(Opt.BOOLEAN) ? booleanArgString(a)
+ : a.argString());
+ if (a.hasOption(Opt.STRING))
+ argSb.append("=value");
+ sb.append(String.format("%-" + maxArgLength + "s - %s",
+ argSb.toString(), a.getDescription()));
+
+ List<String> options = new ArrayList<>();
+
+ if (a.hasOption(Opt.BOOLEAN))
+ {
+ options.add("default " + (a.getDefaultBoolValue() ? a.argString()
+ : a.negateArgString()));
+ }
+
+ if (a.hasOption(Opt.MULTI))
+ {
+ options.add("multiple");
+ }
+
+ if (a.hasOption(Opt.LINKED))
+ {
+ options.add("can be linked");
+ }
+
+ if (a.hasOption(Opt.GLOB))
+ {
+ options.add("allows file globs");
+ }
+
+ if (a.hasOption(Opt.ALLOWSUBSTITUTIONS))
+ {
+ options.add("allows substitutions");
+ }
+
+ if (options.size() > 0)
+ {
+ sb.append(" (");
+ sb.append(String.join("; ", options));
+ sb.append(')');
+ }
+ sb.append(System.lineSeparator());
+ }
+ return sb.toString();
+ }
+}
\ No newline at end of file