Class ArgumentParserImpl

    • Field Detail

      • namedArgIndex_

        private final java.util.Map<java.lang.String,​ArgumentImpl> namedArgIndex_
      • namedArgs_

        private final java.util.List<ArgumentImpl> namedArgs_
      • posArgs_

        private final java.util.List<ArgumentImpl> posArgs_
      • defaults_

        private final java.util.Map<java.lang.String,​java.lang.Object> defaults_
      • command_

        private final java.lang.String command_
      • usage_

        private java.lang.String usage_
      • description_

        private java.lang.String description_
      • epilog_

        private java.lang.String epilog_
      • version_

        private java.lang.String version_
      • defaultHelp_

        private boolean defaultHelp_
      • negNumFlag_

        private boolean negNumFlag_
      • NEG_NUM_PATTERN

        private static final java.util.regex.Pattern NEG_NUM_PATTERN
      • SHORT_OPTS_PATTERN

        private static final java.util.regex.Pattern SHORT_OPTS_PATTERN
    • Method Detail

      • addArgument

        public ArgumentImpl addArgument​(java.lang.String... nameOrFlags)
        Description copied from interface: ArgumentContainer

        Creates new Argument, adds it to this container and returns it.

        The nameOrFlags is either a single name of positional argument or a list of option strings for named argument, e.g. foo or -f, --foo.

        Specified by:
        addArgument in interface ArgumentContainer
        Parameters:
        nameOrFlags - A name or a list of option strings of new Argument.
        Returns:
        Argument object.
      • addArgumentGroup

        public ArgumentGroup addArgumentGroup​(java.lang.String title)
        Description copied from interface: ArgumentParser

        Creates new ArgumentGroup object and adds to this parser and returns the object.

        The title is printed in help message as a title of this group. ArgumentGroup provides a way to conceptually group up command line arguments.

        Specified by:
        addArgumentGroup in interface ArgumentParser
        Parameters:
        title - The title printed in help message.
        Returns:
        ArgumentGroup object.
      • addMutuallyExclusiveGroup

        public MutuallyExclusiveGroup addMutuallyExclusiveGroup​(java.lang.String title)
        Description copied from interface: ArgumentParser

        Creates new mutually exclusive group, MutuallyExclusiveGroup object, and adds to this parser and returns the object.

        The arguments added to this group are mutually exclusive; if more than one argument belong to the group are specified, an error will be reported. The title is printed in help message as a title of this group.

        Specified by:
        addMutuallyExclusiveGroup in interface ArgumentParser
        Parameters:
        title - The title printed in help message.
        Returns:
        The MutuallyExclusiveGroup object.
      • usage

        public ArgumentParserImpl usage​(java.lang.String usage)
        Description copied from interface: ArgumentParser

        Sets the text to display as usage line. By default, the usage line is calculated from the arguments this object contains.

        If the given usage contains ${prog} string, it will be replaced with the program name given in ArgumentParsers.newArgumentParser(String).

        Specified by:
        usage in interface ArgumentParser
        Parameters:
        usage - usage text
        Returns:
        this
      • epilog

        public ArgumentParserImpl epilog​(java.lang.String epilog)
        Description copied from interface: ArgumentParser
        Sets the text to display after the argument help.
        Specified by:
        epilog in interface ArgumentParser
        Parameters:
        epilog - The text to display after the argument help.
        Returns:
        this
      • defaultHelp

        public ArgumentParserImpl defaultHelp​(boolean defaultHelp)
        Description copied from interface: ArgumentParser

        If defaultHelp is true, the default values of arguments are printed in help message.

        By default, the default values are not printed in help message.

        Specified by:
        defaultHelp in interface ArgumentParser
        Parameters:
        defaultHelp - Switch to display the default value in help message.
        Returns:
        this
      • isDefaultHelp

        boolean isDefaultHelp()
      • printArgumentHelp

        private void printArgumentHelp​(java.io.PrintWriter writer,
                                       java.util.List<ArgumentImpl> args,
                                       int format_width)
      • printHelp

        public void printHelp​(java.io.PrintWriter writer)
        Description copied from interface: ArgumentParser
        Prints help message in writer.
        Specified by:
        printHelp in interface ArgumentParser
        Parameters:
        writer - Writer to print message.
      • checkDefaultGroup

        private boolean checkDefaultGroup​(java.util.List<ArgumentImpl> args)
      • formatHelp

        public java.lang.String formatHelp()
        Description copied from interface: ArgumentParser
        Returns help message.
        Specified by:
        formatHelp in interface ArgumentParser
        Returns:
        The help message.
      • printArgumentUsage

        private void printArgumentUsage​(java.io.PrintWriter writer,
                                        java.util.List<java.lang.String> opts,
                                        int offset,
                                        java.lang.String firstIndent,
                                        java.lang.String subsequentIndent,
                                        int format_width)
      • printUsage

        public void printUsage()
        Description copied from interface: ArgumentParser
        Print a brief description of how the program should be invoked on the command line in stdout.
        Specified by:
        printUsage in interface ArgumentParser
      • printUsage

        public void printUsage​(java.io.PrintWriter writer)
        Description copied from interface: ArgumentParser
        Print a brief description of how the program should be invoked on the command line in writer.
        Specified by:
        printUsage in interface ArgumentParser
        Parameters:
        writer - Writer to print message.
      • printUsage

        private void printUsage​(java.io.PrintWriter writer,
                                int format_width)
      • addUpperParserUsage

        private void addUpperParserUsage​(java.util.List<java.lang.String> opts,
                                         ArgumentParserImpl parser)
        Appends command, required named arguments and positional arguments in parser to opts recursively. Most upper parser stores first, just like post order traversal.
        Parameters:
        opts - Command, required named arguments and positional arguments.
        parser - The parser
      • formatUsage

        public java.lang.String formatUsage()
        Description copied from interface: ArgumentParser
        Returns a brief description of how the program should be invoked on the command line.
        Specified by:
        formatUsage in interface ArgumentParser
        Returns:
        Usage text.
      • setDefault

        public ArgumentParserImpl setDefault​(java.lang.String dest,
                                             java.lang.Object value)
        Description copied from interface: ArgumentParser

        Sets parser-level default value of attribute dest.

        The parser-level defaults always override argument-level defaults.

        Specified by:
        setDefault in interface ArgumentParser
        Parameters:
        dest - The attribute name.
        value - The default value.
        Returns:
        this
      • setDefaults

        public ArgumentParserImpl setDefaults​(java.util.Map<java.lang.String,​java.lang.Object> attrs)
        Description copied from interface: ArgumentParser

        Sets parser-level default values from attrs.

        All key-value pair in attrs are registered to parser-level defaults. The parser-level defaults always override argument-level defaults.

        Specified by:
        setDefaults in interface ArgumentParser
        Parameters:
        attrs - The parser-level default values to add.
        Returns:
        this
      • getDefault

        public java.lang.Object getDefault​(java.lang.String dest)
        Returns default value set by ArgumentImpl.setDefault(Object) or setDefault(String, Object). Please note that while parser-level defaults always override argument-level defaults while parsing, this method examines argument-level defaults first. If no default value is found, then check parser-level defaults.
        Specified by:
        getDefault in interface ArgumentParser
        Parameters:
        dest - attribute name of default value to get.
        Returns:
        default value of given dest.
      • parseKnownArgsOrFail

        public Namespace parseKnownArgsOrFail​(java.lang.String[] args,
                                              java.util.List<java.lang.String> unknown)
        Description copied from interface: ArgumentParser

        Just like ArgumentParser.parseArgsOrFail(String[]), but parses only known arguments without throwing exception for unrecognized arguments. If unknown is not null, unrecognized arguments will be stored in it.

        Specified by:
        parseKnownArgsOrFail in interface ArgumentParser
        Parameters:
        args - Command line arguments.
        unknown - Output variable to store unrecognized arguments, or null
        Returns:
        Namespace object.
      • parseKnownArgs

        public void parseKnownArgs​(java.lang.String[] args,
                                   java.util.List<java.lang.String> unknown,
                                   java.util.Map<java.lang.String,​java.lang.Object> attrs)
                            throws ArgumentParserException
        Description copied from interface: ArgumentParser

        Just like ArgumentParser.parseArgs(String[], Map), but parses only known arguments without throwing exception for unrecognized arguments. If unknown is not null, unrecognized arguments will be stored in it.

        Specified by:
        parseKnownArgs in interface ArgumentParser
        Parameters:
        args - Command line arguments.
        unknown - Output variable to store unrecognized arguments, or null
        attrs - Map object to store attributes.
        Throws:
        ArgumentParserException - If an error occurred.
      • parseArgs

        public void parseArgs​(java.lang.String[] args,
                              java.lang.Object userData)
                       throws ArgumentParserException
        Description copied from interface: ArgumentParser

        Parses command line arguments.

        Unlike ArgumentParser.parseArgs(String[]), which returns Namespace object, this method stores attributes in given userData. The location to store value is designated using Arg annotations. User don't have to specify Arg for all attributes: the missing attributes are just skipped. This method performs simple List to generic array conversion. For example, user can assign List<Integer> attribute to generic array int[].

        Specified by:
        parseArgs in interface ArgumentParser
        Parameters:
        args - Command line arguments.
        userData - Object to store attributes.
        Throws:
        ArgumentParserException - If an error occurred.
      • parseKnownArgs

        public void parseKnownArgs​(java.lang.String[] args,
                                   java.util.List<java.lang.String> unknown,
                                   java.lang.Object userData)
                            throws ArgumentParserException
        Description copied from interface: ArgumentParser

        Just like ArgumentParser.parseArgs(String[], Object), but parses only known arguments without throwing exception for unrecognized arguments. If unknown is not null, unrecognized arguments will be stored in it.

        Specified by:
        parseKnownArgs in interface ArgumentParser
        Parameters:
        args - Command line arguments.
        unknown - Output variable to store unrecognized arguments, or null
        userData - Object to store attributes.
        Throws:
        ArgumentParserException - If an error occurred.
      • parseKnownArgs

        public void parseKnownArgs​(java.lang.String[] args,
                                   java.util.List<java.lang.String> unknown,
                                   java.util.Map<java.lang.String,​java.lang.Object> attrs,
                                   java.lang.Object userData)
                            throws ArgumentParserException
        Description copied from interface: ArgumentParser

        Just like ArgumentParser.parseArgs(String[], Map, Object), but parses only known arguments without throwing exception for unrecognized arguments. If unknown is not null, unrecognized arguments will be stored in it.

        Specified by:
        parseKnownArgs in interface ArgumentParser
        Parameters:
        args - Command line arguments.
        unknown - Output variable to store unrecognized arguments, or null
        attrs - Map to store attributes.
        userData - Object to store attributes.
        Throws:
        ArgumentParserException - If an error occurred.
      • fillUserDataFromAttrs

        private void fillUserDataFromAttrs​(java.lang.Object userData,
                                           java.util.Map<java.lang.String,​java.lang.Object> attrs)
      • parseKnownArgsCreatingUnknownIfNeeded

        private void parseKnownArgsCreatingUnknownIfNeeded​(java.lang.String[] args,
                                                           java.util.List<java.lang.String> unknown,
                                                           java.util.Map<java.lang.String,​java.lang.Object> attrs)
                                                    throws ArgumentParserException
        Throws:
        ArgumentParserException
      • parseArgsAtOffsetZero

        private void parseArgsAtOffsetZero​(java.lang.String[] args,
                                           java.util.List<java.lang.String> unknown,
                                           java.util.Map<java.lang.String,​java.lang.Object> attrs)
                                    throws ArgumentParserException
        Throws:
        ArgumentParserException
      • checkConcatenatedShortOpts

        private boolean checkConcatenatedShortOpts​(java.lang.String term)
        Check that term forms a valid concatenated short options. Note that this option does not actually process arguments. Therefore, true from this function does not mean all arguments in term are acceptable.
        Parameters:
        term - string to inspect
        Returns:
        true if term forms a valid concatenated short options.
      • resolveNextFlag

        private ArgumentImpl resolveNextFlag​(java.lang.String flag)
                                      throws ArgumentParserException
        Returns named argument ArgumentImpl which matches given flag. This function handles abbreviation as well. If flag is ambiguous, ArgumentParserException will be thrown. If flag does not match any ArgumentImpl, this function returns null.
        Parameters:
        flag - flag to match
        Returns:
        ArgumentImpl which matches flag if it succeeds, or null
        Throws:
        ArgumentParserException - if flag is ambiguous
      • formatUnrecognizedArgumentErrorMessage

        private java.lang.String formatUnrecognizedArgumentErrorMessage​(ParseState state,
                                                                        java.lang.String args)
        Format message for "Unrecognized arguments" error.
        Parameters:
        state - Current parser state
        args - Textual representation of unrecognized arguments to be included in the message as is.
        Returns:
        formatted error message
      • checkMutex

        private void checkMutex​(ArgumentImpl arg,
                                ArgumentImpl[] groupUsed)
                         throws ArgumentParserException
        Check that another option in mutually exclusive group has already been specified. If so, throw an exception.
        Parameters:
        arg - The argument currently processed
        groupUsed - The cache of used argument in each groups.
        Throws:
        ArgumentParserException - If another option in mutually exclusive group has already been used.
      • processArg

        private void processArg​(java.util.Map<java.lang.String,​java.lang.Object> res,
                                ParseState state,
                                ArgumentImpl arg,
                                java.lang.String flag,
                                java.lang.String embeddedValue)
                         throws ArgumentParserException
        This function only handles a named argument.
        Parameters:
        embeddedValue - If named argument is given as "foo=bar" or "-fbar" (short option), embedded value is "bar". Otherwise null
        Throws:
        ArgumentParserException
      • accumulatePositionalArg

        private void accumulatePositionalArg​(ParseState state,
                                             ArgumentImpl arg)
                                      throws ArgumentParserException
        This function accumulates arguments for a given positional argument. It only accumulates arguments based on how many arguments can be consumed for given Argument object. The actual processing are done later.
        Throws:
        ArgumentParserException
      • flagFound

        private boolean flagFound​(ParseState state)
                           throws ArgumentParserException
        Returns true if state.getArg() is flag. Note that if "--" is met and not consumed, this function returns true, because "--" is treated as special named argument. If prefixFileChar is found in prefix of argument, read arguments from that file and expand arguments in state necessary.
        Throws:
        ArgumentParserException
      • fromFileFound

        private boolean fromFileFound​(ParseState state)
      • extendArgs

        private void extendArgs​(ParseState state,
                                java.lang.String file)
                         throws ArgumentParserException
        Extends arguments by reading additional arguments from file.
        Parameters:
        state - Current parser state.
        file - File from which additional arguments are read.
        Throws:
        ArgumentParserException
      • checkRequiredArgument

        private void checkRequiredArgument​(ParseState state,
                                           java.util.Set<ArgumentImpl> used)
      • populateDefaults

        private void populateDefaults​(java.util.Map<java.lang.String,​java.lang.Object> opts)
      • addArgDefaultIfNotSuppressed

        private void addArgDefaultIfNotSuppressed​(java.util.Map<java.lang.String,​java.lang.Object> opts,
                                                  ArgumentImpl arg)
      • addArgValue

        private void addArgValue​(java.util.Map<java.lang.String,​java.lang.Object> opts,
                                 ArgumentImpl arg,
                                 java.lang.Object value)
      • getActualArgumentName

        private java.lang.String getActualArgumentName​(ArgumentImpl arg)
      • removePrefix

        private java.lang.String removePrefix​(java.lang.String flag)
      • getProg

        public java.lang.String getProg()
      • printVersion

        public void printVersion​(java.io.PrintWriter writer)
        Description copied from interface: ArgumentParser
        Prints version string in writer.
        Specified by:
        printVersion in interface ArgumentParser
        Parameters:
        writer - Writer to print version string.
      • formatVersion

        public java.lang.String formatVersion()
        Description copied from interface: ArgumentParser
        Returns version string.
        Specified by:
        formatVersion in interface ArgumentParser
        Returns:
        The version string.
      • levenshtein

        private int levenshtein​(java.lang.String a,
                                java.lang.String b)
        Calculates Damerau–Levenshtein distance between string a and b with given costs.
        Parameters:
        a - String
        b - String
        Returns:
        Damerau–Levenshtein distance between a and b
      • printFlagCandidates

        private void printFlagCandidates​(java.lang.String flagBody,
                                         java.io.PrintWriter writer)
      • printCommandCandidates

        private void printCommandCandidates​(java.lang.String command,
                                            java.io.PrintWriter writer)
      • printCandidates

        private void printCandidates​(java.lang.String body,
                                     java.util.List<ArgumentParserImpl.SubjectBody> subjects,
                                     java.io.PrintWriter writer)
        Prints most similar subjects in subjects to body. Similarity is calculated between body and each ArgumentParserImpl.SubjectBody.body in subjects.
        Parameters:
        body - String to compare.
        subjects - Target to be compared.
        writer - Output
      • substitutePlaceholder

        private java.lang.String substitutePlaceholder​(java.lang.String src)
        Replace placeholder in src with actual value. The only known placeholder is ${prog}, which is replaced with config_.prog_.
        Parameters:
        src - string to be processed
        Returns:
        the substituted string
      • getCommand

        public java.lang.String getCommand()
      • getPrefixChars

        public java.lang.String getPrefixChars()
      • getFromFilePrefixChars

        public java.lang.String getFromFilePrefixChars()
      • getMainParser

        ArgumentParserImpl getMainParser()
        Returns main (parent) parser.
        Returns:
        The main (parent) parser. null if this object is a root parser.
      • localize

        java.lang.String localize​(java.lang.String messageKey)