dependencies {
// Required for all platforms
implementation 'io.github.revxrsal:lamp.common:[VERSION]'
// CLI module
implementation 'io.github.revxrsal:lamp.cli:[VERSION]'
}
dependencies {
// Required for all platforms
implementation("io.github.revxrsal:lamp.common:[VERSION]")
// CLI module
implementation("io.github.revxrsal:lamp.cli:[VERSION]")
}
Optional: Preserve parameter names
Lamp identifies parameters by their names and uses them to generate relevant command metadata. By default, Java does not preserve parameter names reflectively. You need to add the following to your project:
compileJava {
// Preserve parameter names in the bytecode
options.compilerArgs += ["-parameters"]
}
// optional: if you're using Kotlin
compileKotlin {
kotlinOptions.javaParameters = true
}
tasks.withType<JavaCompile> {
// Preserve parameter names in the bytecode
options.compilerArgs.add("-parameters")
}
// optional: if you're using Kotlin
tasks.withType<KotlinJvmCompile> {
compilerOptions {
javaParameters = true
}
}
Supported CLI types
java.util.Scanner in place of CommandActor
java.io.PrintStream in place of CommandActor
Example
Execute and exit
public final class CLIApp {
public static void main(String[] args) {
var lamp = CLILamp.builder()
.build();
lamp.register(new PingCommand());
/* register all other commands here */
ConsoleActor actor = ActorFactory.defaultFactory().createForStdIo(lamp);
lamp.dispatch(actor, String.join(" ", args));
}
static class PingCommand {
@Command("ping")
public void ping(ConsoleActor actor) {
actor.reply("Pong!");
}
}
}
fun main(args: Array<String>) {
val lamp = CLILamp.builder().build()
lamp.register(PingCommand())
/* register all other commands here */
val actor = ActorFactory.defaultFactory().createForStdIo(lamp)
lamp.dispatch(actor, args.joinToString(" "))
}
class PingCommand {
@Command("ping")
fun ping(actor: ConsoleActor) {
actor.reply("Pong!")
}
}
Poll console indefinitely
public final class CLIApp {
public static void main(String[] args) {
var lamp = CLILamp.builder()
.build();
lamp.register(new PingCommand());
/* register all other commands here */
// Call this to continuously read input from the console
//
// pollStdin() is CLIVisitors.pollStdin().
// we use static imports here for brevity.
lamp.accept(pollStdin());
}
static class PingCommand {
@Command("ping")
public void ping(ConsoleActor actor) {
actor.reply("Pong!");
}
}
}
fun main(args: Array<String>) {
val lamp = CLILamp.builder().build()
lamp.register(PingCommand())
/* register all other commands here */
// Call this to continuously read input from the console
//
// pollStdin() is CLIVisitors.pollStdin().
// we use static imports here for brevity.
lamp.accept(pollStdin())
}
class PingCommand {
@Command("ping")
fun ping(actor: ConsoleActor) {
actor.reply("Pong!")
}
}