jf is a jo alternative, A small utility to safely format and print JSON objects in the commandline.
However, unlike jo, where you build the JSON object by nesting jo outputs,
jf works similar to printf, i.e. it expects the template in YAML format as the first argument, and then the values for the placeholders as subsequent arguments.
As a CLI tool
bash
cargo install jf
Or as a library:
bash
cargo add jf
bash
nix-env -f https://github.com/NixOS/nixpkgs/tarball/nixos-unstable -iA jf
bash
jf TEMPLATE [VALUE]... [NAME=VALUE]...
Where TEMPLATE may contain the following placeholders:
%q quoted and safely escaped JSON string%s JSON values other than string%v the jf version number%% a literal % characterAnd [VALUE]... [NAME=VALUE]... are the values for the placeholders.
%s %q posiitonal placeholder%(NAME)s %(NAME)q named placeholder%(NAME=DEFAULT)s %(NAME=DEFAULT)q placeholder with default value%(NAME?)s %(NAME?)q nullable placeholder that defaults to null%(NAME)?s %(NAME)?q optional placeholder that defaults to blank%*s %*q expand positional values as array items%**s %**q expand positional values as key value pairs%(NAME)*s %(NAME)*q expand named values as array items%(NAME)**s %(NAME)**q expand named values as key value pairsNAME=VALUE syntax.NAME=ITEM_N syntax.NAME=KEY_N NAME=VALUE_N syntax.```bash jf %s 1
jf %q 1
jf [%*s] 1 2 3
jf {%**q} one 1 two 2 three 3
jf "{%q: %(value=default)q, %(bar)**q}" foo value=bar bar=biz bar=baz
jf "{str or bool: %(str)?q %(bool)?s, nullable: %(nullable?)q}" str=true
jf '{1: %s, two: %q, 3: %(3)s, four: %(four=4)q, "%%": %(pct?)q}' 1 2 3=3
```
You can set the following aliases in your shell:
bash
alias str='jf %q'
alias arr='jf "[%*s]"'
alias obj='jf "{%**s}"'
Then you can use them like this:
```bash str 1
arr 1 2 3
obj one 1 two 2 three 3
obj 1 2 3 $(arr 4 $(str 5))
```
rust
let json = match jf::format(["%q", "JSON Formatted"].map(Into::into)) {
Ok(value) => value,
Err(jf::Error::Usage) => {
bail!("usage: mytool: TEMPLATE [VALUE]... [NAME=VALUE]...")
}
Err(jf::Error::Jf(e)) => bail!("mytool: {e}"),
Err(jf::Error::Json(e)) => bail!("mytool: json: {e}"),
Err(jf::Error::Yaml(e)) => bail!("mytool: yaml: {e}"),
};