Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

jbock-java/jbock

Open more actions menu

Repository files navigation

jbock-compiler jbock

jbock is a command line parser, which uses the same well-known annotation names as JCommander and picocli. It is an annotation processor which does not use runtime reflection, but generates a custom parser at compile time instead.

Quick rundown

Create an abstract class, or alternatively a Java interface, and add the @Command annotation. In this so-called command class, each abstract method represents a command line option or argument. Every such method must have

  • getter signature (doesn't return void, takes no arguments) and
  • annotation (either @Option, @Parameter or @VarargsParameter).

The types boolean, List and Optional (including OptionalInt) have special meaning. See example below.

@Command
abstract class DeleteCommand {

  @Option(names = {"-v", "--verbosity"},
          description = {"A non-required, named option. The return type is optionalish.",
                         "Using int or Integer would make it required."})
  abstract OptionalInt verbosity();

  @Parameter(
          index = 0,
          description = {"A required positional parameter. Return type is not optionalish.",
                         "Built-in converter is available for type Path."})
  abstract Path path();

  @Parameter(
          index = 1,
          description = "An optional positional parameter.")
  abstract Optional<Path> anotherPath();

  @VarargsParameter(
          description = {"A varargs parameter. There can only be one of these.",
                         "Must return List."})
  abstract List<Path> morePaths();
  
  @Option(names = "--dry-run",
          description = "A nullary option, a.k.a. mode flag. Must return boolean.")
  abstract boolean dryRun();
  
  @Option(names = "-h",
          description = "A repeatable option. Must return List.")
  abstract List<String> headers(); 
  
  @Option(names = "--charset",
          description = "Named option with a custom converter",
          converter = CharsetConverter.class)
  abstract Optional<Charset> charset();
  
  static class CharsetConverter extends StringConverter<Charset> {
    @Override
    protected Charset convert(String token) { return Charset.forName(token); }
  }
}

The generated class is called *Parser.

public static void main(String[] args) {
  DeleteCommand command = DeleteCommandParser.parseOrExit(args);
  // alternatively:
  // Either<ParsingFailed, DeleteCommand> either = DeleteCommandParser.parse(List.of(args));
}

Standard types

Some types don't need a custom converter. See StandardConverters.java.

Subcommands

The @SuperCommand annotation can be used to define a git-like subcommand structure. See javadoc.

Sample projects

Alternatives

About

Reflectionless command line parser

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  
Morty Proxy This is a proxified and sanitized view of the page, visit original site.