diff options
Diffstat (limited to 'testutil/src/main/java/com/yahoo/test/json/JsonBuilder.java')
-rw-r--r-- | testutil/src/main/java/com/yahoo/test/json/JsonBuilder.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/testutil/src/main/java/com/yahoo/test/json/JsonBuilder.java b/testutil/src/main/java/com/yahoo/test/json/JsonBuilder.java new file mode 100644 index 00000000000..bbb8586a290 --- /dev/null +++ b/testutil/src/main/java/com/yahoo/test/json/JsonBuilder.java @@ -0,0 +1,75 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.test.json; + +import com.fasterxml.jackson.core.io.JsonStringEncoder; + +/** + * String buffer for building a formatted JSON. + * + * @author hakonhall + */ +class JsonBuilder { + private final JsonStringEncoder jsonStringEncoder = JsonStringEncoder.getInstance(); + private final StringBuilder builder = new StringBuilder(); + private final String indentation; + private final boolean multiLine; + private final String colon; + + private boolean bol = true; + private int level = 0; + + static JsonBuilder forCompactJson() { return new JsonBuilder(0, true); } + static JsonBuilder forMultiLineJson(int spacesPerIndent) { return new JsonBuilder(spacesPerIndent, false); } + + JsonBuilder(int spacesPerIndent, boolean compact) { + this.indentation = compact ? "" : " ".repeat(spacesPerIndent); + this.multiLine = !compact; + this.colon = compact ? ":" : ": "; + } + + void appendLineAndIndent(String text) { appendLineAndIndent(text, 0); } + + void newLineIndentAndAppend(int levelShift, String text) { + appendNewLine(); + indent(levelShift); + append(text); + } + + void appendLineAndIndent(String text, int levelShift) { + appendLine(text); + indent(levelShift); + append(""); + } + + void appendColon() { builder.append(colon); } + + void appendStringValue(String rawString) { + builder.append('"'); + jsonStringEncoder.quoteAsString(rawString, builder); + builder.append('"'); + } + + void append(String textWithoutNewline) { + if (bol) { + builder.append(indentation.repeat(level)); + bol = false; + } + + builder.append(textWithoutNewline); + } + + private void indent(int levelShift) { level += levelShift; } + + private void appendLine(String text) { + append(text); + appendNewLine(); + } + + private void appendNewLine() { + if (multiLine) builder.append('\n'); + bol = true; + } + + @Override + public String toString() { return builder.toString(); } +} |