Skip to content

Commit

Permalink
adding json/jsonPretty handlebar helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
rmannibucau committed Mar 24, 2023
1 parent 634f6e6 commit 7db9fa3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 5 deletions.
6 changes: 3 additions & 3 deletions src/main/java/io/yupiik/yuc/command/DefaultCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void run() {
final var input = io.openInput(charset, conf.input());
try (final var parser = new JsonParser(input, conf.bufferProviderSize(), new BufferProvider(conf.bufferProviderSize()), true);
final var writer = io.openOutput(charset, conf.output())) {
final var visitor = newVisitor(writer);
final var visitor = newVisitor(writer, charset);
while (parser.hasNext()) {
switch (parser.next()) {
case START_ARRAY -> visitor.onStartArray();
Expand All @@ -61,10 +61,10 @@ public void run() {
}
}

private JsonVisitor newVisitor(final Writer writer) {
private JsonVisitor newVisitor(final Writer writer, final Charset charset) {
final var output = new SimpleWriter(writer);
return switch (conf.outputType()) {
case HANDLEBAR -> new HandlebarFormatter(output, conf.handlebar(), jsonMapper);
case HANDLEBAR -> new HandlebarFormatter(output, conf.handlebar(), jsonMapper, charset);
case PRETTY -> new PrettyFormatter(output, getColorScheme());
default -> new DefaultFormatter(output, getColorScheme());
};
Expand Down
14 changes: 12 additions & 2 deletions src/main/java/io/yupiik/yuc/formatter/impl/HandlebarFormatter.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,26 @@
import io.yupiik.fusion.framework.handlebars.HandlebarsCompiler;
import io.yupiik.fusion.framework.handlebars.compiler.accessor.MapAccessor;
import io.yupiik.fusion.json.JsonMapper;
import io.yupiik.fusion.json.pretty.PrettyJsonMapper;
import io.yupiik.yuc.command.configuration.ColorScheme;
import io.yupiik.yuc.formatter.SimpleWriter;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.Map;

public class HandlebarFormatter extends DefaultFormatter {
private final String template;
private final Writer writer;
private final JsonMapper jsonMapper;
private final Charset charset;

public HandlebarFormatter(final SimpleWriter output, final String template, final JsonMapper jsonMapper) {
public HandlebarFormatter(final SimpleWriter output, final String template, final JsonMapper jsonMapper,
final Charset charset) {
super(new SimpleWriter(new StringWriter()), ColorScheme.NONE);
this.charset = charset;
this.writer = output.delegate();
this.template = template;
this.jsonMapper = jsonMapper;
Expand All @@ -26,8 +32,12 @@ public HandlebarFormatter(final SimpleWriter output, final String template, fina
public void onEnd() {
try {
output.delegate().close();
final var settings = new HandlebarsCompiler.Settings()
.helpers(Map.of(
"json", jsonMapper::toString,
"jsonPretty", o -> new PrettyJsonMapper(jsonMapper, charset).toString(o)));
final var hb = new HandlebarsCompiler(new MapAccessor())
.compile(new HandlebarsCompiler.CompilationContext(new HandlebarsCompiler.Settings(), template));
.compile(new HandlebarsCompiler.CompilationContext(settings, template));
final var json = output.delegate().toString();
final var object = jsonMapper.fromString(Object.class, json);
final var rendered = hb.render(object);
Expand Down
47 changes: 47 additions & 0 deletions src/test/java/io/yupiik/yuc/command/DefaultCommandTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,53 @@ void handlebars(final Stdout stdout) {
assertEquals("value1", stdout.content());
}

@FusionCLITest(args = {
"default", "--input", "src/test/resources/some.json",
"--appendEol", "false",
"--outputType", "HANDLEBAR", "--handlebar", "{{json a-string}}"})
void handlebarsJsonHelper(final Stdout stdout) {
assertEquals("\"value1\"", stdout.content());
}

@FusionCLITest(args = {
"default", "--input", "src/test/resources/some.json",
"--appendEol", "false",
"--outputType", "HANDLEBAR", "--handlebar", "{{json .}}"})
void handlebarsJsonHelperObj(final Stdout stdout) {
assertEquals("{\"a-string\":\"value1\",\"a-number\":1234,\"a-boolean\":true,\"a-null\":null,\"a-nested-object\":{\"nested\":true},\"a-list\":[\"s1\"]}", stdout.content());
}

@FusionCLITest(args = {
"default", "--input", "src/test/resources/some.json",
"--appendEol", "false",
"--outputType", "HANDLEBAR", "--handlebar", "{{jsonPretty this}}"})
void handlebarsJsonPrettyHelperObj(final Stdout stdout) {
assertEquals("""
{
"a-string": "value1",
"a-number": 1234,
"a-boolean": true,
"a-null": null,
"a-nested-object": {
"nested": true
},
"a-list": [
"s1"
]
}""", stdout.content());
}

@FusionCLITest(args = {
"default", "--input", "src/test/resources/some.json",
"--appendEol", "false",
"--outputType", "HANDLEBAR", "--handlebar", "{{jsonPretty a-nested-object}}"})
void handlebarsJsonPrettyFilterObj(final Stdout stdout) {
assertEquals("""
{
"nested": true
}""", stdout.content());
}

@FusionCLITest(args = {"default", "--input", "src/test/resources/some.json", "--colored", "true", "--outputType", "INLINE"})
void colored(final Stdout stdout) {
assertEquals("" +
Expand Down

0 comments on commit 7db9fa3

Please sign in to comment.