mirror of
https://github.com/lightbend/config.git
synced 2025-03-23 07:40:25 +08:00
make ConfigValue.toString create a single-line compact string
while render() creates the formatted verbose string with comments.
This commit is contained in:
parent
69b5a765df
commit
ff2a5064aa
@ -261,22 +261,34 @@ abstract class AbstractConfigObject extends AbstractConfigValue implements
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
if (isEmpty()) {
|
||||
sb.append("{}");
|
||||
} else {
|
||||
sb.append("{\n");
|
||||
sb.append("{");
|
||||
if (formatted)
|
||||
sb.append('\n');
|
||||
for (String k : keySet()) {
|
||||
AbstractConfigValue v = peek(k);
|
||||
indent(sb, indent + 1);
|
||||
sb.append("# ");
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent + 1);
|
||||
v.render(sb, indent + 1, k);
|
||||
sb.append(",\n");
|
||||
if (formatted) {
|
||||
indent(sb, indent + 1);
|
||||
sb.append("# ");
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent + 1);
|
||||
}
|
||||
v.render(sb, indent + 1, k, formatted);
|
||||
sb.append(",");
|
||||
if (formatted)
|
||||
sb.append('\n');
|
||||
}
|
||||
// chop comma or newline
|
||||
sb.setLength(sb.length() - 1);
|
||||
if (formatted) {
|
||||
sb.setLength(sb.length() - 1); // also chop comma
|
||||
sb.append("\n"); // put a newline back
|
||||
indent(sb, indent);
|
||||
}
|
||||
indent(sb, indent);
|
||||
sb.append("}");
|
||||
}
|
||||
}
|
||||
|
@ -163,7 +163,9 @@ abstract class AbstractConfigValue implements ConfigValue {
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
return getClass().getSimpleName() + "(" + render() + ")";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
render(sb, 0, null /* atKey */, false /* formatted */);
|
||||
return getClass().getSimpleName() + "(" + sb.toString() + ")";
|
||||
}
|
||||
|
||||
protected static void indent(StringBuilder sb, int indent) {
|
||||
@ -174,15 +176,15 @@ abstract class AbstractConfigValue implements ConfigValue {
|
||||
}
|
||||
}
|
||||
|
||||
protected void render(StringBuilder sb, int indent, String atKey) {
|
||||
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
|
||||
if (atKey != null) {
|
||||
sb.append(ConfigUtil.renderJsonString(atKey));
|
||||
sb.append(" : ");
|
||||
}
|
||||
render(sb, indent);
|
||||
render(sb, indent, formatted);
|
||||
}
|
||||
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
Object u = unwrapped();
|
||||
sb.append(u.toString());
|
||||
}
|
||||
@ -191,7 +193,7 @@ abstract class AbstractConfigValue implements ConfigValue {
|
||||
@Override
|
||||
public final String render() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
render(sb, 0, null);
|
||||
render(sb, 0, null, true /* formatted */);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
@ -161,17 +161,20 @@ final class ConfigDelayedMerge extends AbstractConfigValue implements
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent, String atKey) {
|
||||
render(stack, sb, indent, atKey);
|
||||
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
|
||||
render(stack, sb, indent, atKey, formatted);
|
||||
}
|
||||
|
||||
// static method also used by ConfigDelayedMergeObject.
|
||||
static void render(List<AbstractConfigValue> stack, StringBuilder sb, int indent, String atKey) {
|
||||
sb.append("# unresolved merge of " + stack.size() + " values follows (\n");
|
||||
if (atKey == null) {
|
||||
indent(sb, indent);
|
||||
sb.append("# this unresolved merge will not be parseable because it's at the root of the object\n");
|
||||
sb.append("# the HOCON format has no way to list multiple root objects in a single file\n");
|
||||
static void render(List<AbstractConfigValue> stack, StringBuilder sb, int indent, String atKey,
|
||||
boolean formatted) {
|
||||
if (formatted) {
|
||||
sb.append("# unresolved merge of " + stack.size() + " values follows (\n");
|
||||
if (atKey == null) {
|
||||
indent(sb, indent);
|
||||
sb.append("# this unresolved merge will not be parseable because it's at the root of the object\n");
|
||||
sb.append("# the HOCON format has no way to list multiple root objects in a single file\n");
|
||||
}
|
||||
}
|
||||
|
||||
List<AbstractConfigValue> reversed = new ArrayList<AbstractConfigValue>();
|
||||
@ -180,27 +183,36 @@ final class ConfigDelayedMerge extends AbstractConfigValue implements
|
||||
|
||||
int i = 0;
|
||||
for (AbstractConfigValue v : reversed) {
|
||||
indent(sb, indent);
|
||||
if (atKey != null) {
|
||||
sb.append("# unmerged value " + i + " for key "
|
||||
+ ConfigUtil.renderJsonString(atKey) + " from ");
|
||||
} else {
|
||||
sb.append("# unmerged value " + i + " from ");
|
||||
if (formatted) {
|
||||
indent(sb, indent);
|
||||
if (atKey != null) {
|
||||
sb.append("# unmerged value " + i + " for key "
|
||||
+ ConfigUtil.renderJsonString(atKey) + " from ");
|
||||
} else {
|
||||
sb.append("# unmerged value " + i + " from ");
|
||||
}
|
||||
i += 1;
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent);
|
||||
}
|
||||
i += 1;
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent);
|
||||
|
||||
if (atKey != null) {
|
||||
sb.append(ConfigUtil.renderJsonString(atKey));
|
||||
sb.append(" : ");
|
||||
}
|
||||
v.render(sb, indent);
|
||||
sb.append(",\n");
|
||||
v.render(sb, indent, formatted);
|
||||
sb.append(",");
|
||||
if (formatted)
|
||||
sb.append('\n');
|
||||
}
|
||||
// chop comma or newline
|
||||
sb.setLength(sb.length() - 1);
|
||||
if (formatted) {
|
||||
sb.setLength(sb.length() - 1); // also chop comma
|
||||
sb.append("\n"); // put a newline back
|
||||
indent(sb, indent);
|
||||
sb.append("# ) end of unresolved merge\n");
|
||||
}
|
||||
sb.setLength(sb.length() - 2); // chop comma and newline
|
||||
sb.append("\n");
|
||||
indent(sb, indent);
|
||||
sb.append("# ) end of unresolved merge\n");
|
||||
}
|
||||
}
|
||||
|
@ -139,8 +139,8 @@ class ConfigDelayedMergeObject extends AbstractConfigObject implements
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent, String atKey) {
|
||||
ConfigDelayedMerge.render(stack, sb, indent, atKey);
|
||||
protected void render(StringBuilder sb, int indent, String atKey, boolean formatted) {
|
||||
ConfigDelayedMerge.render(stack, sb, indent, atKey, formatted);
|
||||
}
|
||||
|
||||
private static ConfigException notResolved() {
|
||||
|
@ -36,7 +36,7 @@ final class ConfigNull extends AbstractConfigValue {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
sb.append("null");
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ final class ConfigString extends AbstractConfigValue {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
sb.append(ConfigUtil.renderJsonString(value));
|
||||
}
|
||||
}
|
||||
|
@ -244,7 +244,7 @@ final class ConfigSubstitution extends AbstractConfigValue implements
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
for (Object p : pieces) {
|
||||
if (p instanceof Path) {
|
||||
sb.append("${");
|
||||
|
@ -135,24 +135,32 @@ final class SimpleConfigList extends AbstractConfigValue implements ConfigList {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void render(StringBuilder sb, int indent) {
|
||||
protected void render(StringBuilder sb, int indent, boolean formatted) {
|
||||
if (value.isEmpty()) {
|
||||
sb.append("[]");
|
||||
} else {
|
||||
sb.append("[\n");
|
||||
sb.append("[");
|
||||
if (formatted)
|
||||
sb.append('\n');
|
||||
for (AbstractConfigValue v : value) {
|
||||
indent(sb, indent + 1);
|
||||
sb.append("# ");
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent + 1);
|
||||
v.render(sb, indent + 1);
|
||||
sb.append(",\n");
|
||||
if (formatted) {
|
||||
indent(sb, indent + 1);
|
||||
sb.append("# ");
|
||||
sb.append(v.origin().description());
|
||||
sb.append("\n");
|
||||
indent(sb, indent + 1);
|
||||
}
|
||||
v.render(sb, indent + 1, formatted);
|
||||
sb.append(",");
|
||||
if (formatted)
|
||||
sb.append('\n');
|
||||
}
|
||||
sb.setLength(sb.length() - 1); // chop or newline
|
||||
if (formatted) {
|
||||
sb.setLength(sb.length() - 1); // also chop comma
|
||||
sb.append('\n');
|
||||
indent(sb, indent);
|
||||
}
|
||||
sb.setLength(sb.length() - 2); // chop comma and newline
|
||||
sb.append("\n");
|
||||
|
||||
indent(sb, indent);
|
||||
sb.append("]");
|
||||
}
|
||||
}
|
||||
|
@ -11,6 +11,10 @@ object RenderExample extends App {
|
||||
println("=== BEGIN RESOLVED " + what)
|
||||
println(conf.resolve().root.render())
|
||||
println("=== END RESOLVED " + what)
|
||||
|
||||
println("=== BEGIN UNRESOLVED toString() " + what)
|
||||
println(conf.root.toString())
|
||||
println("=== END UNRESOLVED toString() " + what)
|
||||
}
|
||||
|
||||
render("test01")
|
||||
|
Loading…
Reference in New Issue
Block a user