JSON-RPC CLI
JSON-RPC CLI module enables you to write a command line application re-using JSON-RPC programming model.
Dependency
To get started and have the right classpath, start by adding this dependency:
<dependency>
<groupId>io.yupiik.uship</groupId>
<artifactId>jsonrpc-cli</artifactId>
<version>${uship.version}</version>
</dependency>
Write a command
To write an user command, just write a JSON-RPC endpoint as usual:
@JsonRpc
@ApplicationScoped
public class SampleCommand {
@JsonRpcMethod(name = "my-command")
public MyResponse command(@JsonRpcParam("first") final MyRequest request) {
return ....;
}
}
Important
|
as it uses µship CDI integration, don’t forget a META-INF/beans.xml in your resources (it can be empty) to enable the module scanning.
|
Launch the CLI
You can use any main
and handle the command execution with io.yupiik.uship.jsonrpc.cli.api.JsonRpcCliExecutor
to execute the command once the arguments parsed.
However, io.yupiik.uship.jsonrpc.cli.main.JsonRpcCli
provides a default main
with these features:
-
Script handling using
-f
(or--file
): each line not starting with a#
or being empty will be parsed and executed as a command, -
Container log lines are hidden until their level is severe enough (INFO are skipped) making it more CLI friendly,
-
CDI container uses default discovery (scanning).
Usage:
java \
-cp $classpath \
io.yupiik.uship.jsonrpc.cli.main.JsonRpcCli \
$command \
$parameters
Parameters
The parameters of the command are passed using the form $name $value
. It means that you must always have pairs of arguments (a b c
will fail because it missed a fourth parameter).
The parameters are bound as a JSON-RPC request using the parameter type as indicator, if a primitive the value is directly used, if a class or list it is handled using a properties syntax, etc…
Properties syntax
The properties syntax uses a flattenized form of objects/simple lists:
public class Nested {
private String name;
private List<String> list;
}
public class Root {
private Nested nested;
}
To configure this model, for example, you will use these properties - assuming the parameter of type Root
is passed to the JSON-RPC method and named root
:
root.nested.name = xxx
root.nested.list.0 = yyy
root.nested.list.1 = zzz
Tip
|
for list of objects $list.$index.$nestedAttribute format is used.
|
From the command line, .
can be replaced by -
to make it CLI friendly (previous example would look like: --root-nested-name MyName
for example).
Streams injections
stdout
and stderr
can be injected in commands using @StdOut @Inject PrintStream stdout;
or @StdErr @Inject PrintStream stderr;
.
It is often needed when you want to output data using streaming instead of passing the data to the result of the command.