package io.trygvis.rules.terraform; import com.fasterxml.jackson.annotation.JsonValue; import java.util.*; @SuppressWarnings("unused") public class TerraformResource { private static final String EOL = System.getProperty("line.separator"); private final String output; private final String kind; private final String instance; private final Map values = new LinkedHashMap<>(); public TerraformResource(String output, String kind, String instance) { this.output = output; this.kind = kind; this.instance = instance; } public String getOutput() { return output; } public String getKind() { return kind; } public String getInstance() { return instance; } public Map getValues() { return values; } public void set(String key, String value) { values.put(key, new StringTerraformValue(value)); } public void set(String key, boolean value) { values.put(key, new BooleanTerraformValue(value)); } public void set(String key, int value) { values.put(key, new IntegerTerraformValue(value)); } public void setExpression(String key, String value) { values.put(key, new ExpressionTerraformValue(value)); } public ArrayTerraformValue array(String key) { var array = new ArrayTerraformValue(); values.put(key, array); return array; } public String asString() { var buf = new StringBuilder(); buf.append(quote(kind)); buf.append(" "); buf.append(quote(instance)); buf.append(" {"); buf.append(EOL); for (var entry : values.entrySet()) { buf.append(" "); buf.append(entry.getKey()); buf.append(" = "); buf.append(entry.getValue().asString()); buf.append(EOL); } buf.append("}"); buf.append(EOL); return buf.toString(); } public interface TerraformValue { String asString(); } public static class StringTerraformValue implements TerraformValue { private final String value; public StringTerraformValue(String value) { this.value = value; } @JsonValue public String getValue() { return value; } @Override public String asString() { return quote(value); } } public static class BooleanTerraformValue implements TerraformValue { private final boolean value; public BooleanTerraformValue(boolean value) { this.value = value; } @JsonValue public boolean getValue() { return value; } @Override public String asString() { return String.valueOf(value); } } public static class IntegerTerraformValue implements TerraformValue { private final int value; public IntegerTerraformValue(int value) { this.value = value; } @JsonValue public int getValue() { return value; } @Override public String asString() { return String.valueOf(value); } } public static class ExpressionTerraformValue implements TerraformValue { private final String value; public ExpressionTerraformValue(String value) { this.value = value; } @JsonValue public String getValue() { return value; } @Override public String asString() { return value; } } public static class ArrayTerraformValue implements TerraformValue { private final List values = new ArrayList<>(); @JsonValue public List getValues() { return values; } public ArrayTerraformValue add(String value) { values.add(new StringTerraformValue(value)); return this; } public ArrayTerraformValue add(int value) { values.add(new IntegerTerraformValue(value)); return this; } public ArrayTerraformValue add(boolean value) { values.add(new BooleanTerraformValue(value)); return this; } public ArrayTerraformValue addExpression(String value) { values.add(new ExpressionTerraformValue(value)); return this; } @Override public String asString() { if (values.isEmpty()) { return "[]"; } if (values.size() == 1) { return "[" + values.get(0).asString() + "]"; } var j = new StringJoiner(",\n ", "[\n", "\n ]"); values.forEach(value -> j.add(value.asString())); return j.toString(); } } private static String quote(String value) { return "\"%s\"".formatted(value); } }