Package picocli

Class CommandLine.RunLast

  • All Implemented Interfaces:
    CommandLine.IExecutionStrategy, CommandLine.IParseResultHandler, CommandLine.IParseResultHandler2<java.util.List<java.lang.Object>>
    Enclosing class:
    CommandLine

    public static class CommandLine.RunLast
    extends CommandLine.AbstractParseResultHandler<java.util.List<java.lang.Object>>
    implements CommandLine.IParseResultHandler
    Command line execution strategy that prints help if requested, and otherwise executes the most specific Runnable or Callable subcommand. For use by the execute method.

    Something like this:

    
         // RunLast implementation: print help if requested, otherwise execute the most specific subcommand
         List<CommandLine> parsedCommands = parseResult.asCommandLineList();
         if (CommandLine.printHelpIfRequested(parsedCommands, out(), err(), ansi())) {
             return emptyList();
         }
         CommandLine last = parsedCommands.get(parsedCommands.size() - 1);
         Object command = last.getCommand();
         Object result = null;
         if (command instanceof Runnable) {
             try {
                 ((Runnable) command).run();
             } catch (Exception ex) {
                 throw new ExecutionException(last, "Error in runnable " + command, ex);
             }
         } else if (command instanceof Callable) {
             try {
                 result = ((Callable) command).call();
             } catch (Exception ex) {
                 throw new ExecutionException(last, "Error in callable " + command, ex);
             }
         } else {
             throw new ExecutionException(last, "Parsed command (" + command + ") is not Runnable or Callable");
         }
         last.setExecutionResult(result);
         return Arrays.asList(result);
     

    From picocli v2.0, RunLast is used to implement the run and call convenience methods.

    Since:
    2.0
    • Constructor Detail

      • RunLast

        public RunLast()
    • Method Detail

      • handleParseResult

        public java.util.List<java.lang.Object> handleParseResult​(java.util.List<CommandLine> parsedCommands,
                                                                  java.io.PrintStream out,
                                                                  CommandLine.Help.Ansi ansi)
        Prints help if requested, and otherwise executes the most specific Runnable or Callable subcommand.

        For repeatable subcommands, this method may execute multiple subcommands: the most deeply nested subcommands that have the same parent command.

        Finally, either a list of result objects is returned, or the JVM is terminated if an exit code was set.

        If the last (sub)command does not implement either Runnable or Callable, an ExecutionException is thrown detailing the problem and capturing the offending CommandLine object.

        Specified by:
        handleParseResult in interface CommandLine.IParseResultHandler
        Parameters:
        parsedCommands - the CommandLine objects that resulted from successfully parsing the command line arguments
        out - the PrintStream to print help to if requested
        ansi - for printing help messages using ANSI styles and colors
        Returns:
        an empty list if help was requested, or a list containing a single element: the result of calling the Callable, or a null element if the last (sub)command was a Runnable
        Throws:
        CommandLine.ParameterException - if the HelpCommand was invoked for an unknown subcommand. Any ParameterExceptions thrown from this method are treated as if this exception was thrown during parsing and passed to the CommandLine.IExceptionHandler
        CommandLine.ExecutionException - if a problem occurred while processing the parse results; use CommandLine.ExecutionException.getCommandLine() to get the command or subcommand where processing failed
      • handle

        protected java.util.List<java.lang.Object> handle​(CommandLine.ParseResult parseResult)
                                                   throws CommandLine.ExecutionException
        Executes the most specific Runnable or Callable subcommand.

        For repeatable subcommands, this method may execute multiple subcommands: the most deeply nested subcommands that have the same parent command.

        If the user object of the executed (sub)command does not implement either Runnable or Callable and is not a Method, an ExecutionException is thrown detailing the problem and capturing the offending CommandLine object.

        Specified by:
        handle in class CommandLine.AbstractParseResultHandler<java.util.List<java.lang.Object>>
        Parameters:
        parseResult - the ParseResult that resulted from successfully parsing the command line arguments
        Returns:
        an empty list if help was requested, or a list containing a single element: the result of calling the Callable, or a null element if the last (sub)command was a Runnable
        Throws:
        CommandLine.ExecutionException - if a problem occurred while processing the parse results; use CommandLine.ExecutionException.getCommandLine() to get the command or subcommand where processing failed
        Since:
        3.0
      • executeUserObjectOfLastSubcommandWithSameParent

        private static java.util.List<java.lang.Object> executeUserObjectOfLastSubcommandWithSameParent​(java.util.List<CommandLine> parsedCommands)
      • indexOfLastSubcommandWithSameParent

        private static int indexOfLastSubcommandWithSameParent​(java.util.List<CommandLine> parsedCommands)