summaryrefslogtreecommitdiff
path: root/modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java
diff options
context:
space:
mode:
Diffstat (limited to 'modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java')
-rw-r--r--modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java213
1 files changed, 213 insertions, 0 deletions
diff --git a/modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java b/modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java
new file mode 100644
index 0000000..351a3e1
--- /dev/null
+++ b/modules/ri-base/src/main/java/io/trygvis/rules/terraform/TerraformResource.java
@@ -0,0 +1,213 @@
+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<String, TerraformValue> 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 getName() {
+ return kind + "." + instance;
+ }
+
+ public String getKind() {
+ return kind;
+ }
+
+ public String getInstance() {
+ return instance;
+ }
+
+ public Map<String, TerraformValue> getValues() {
+ return values;
+ }
+
+ public TerraformResource set(String key, String value) {
+ values.put(key, new StringTerraformValue(value));
+ return this;
+ }
+
+ public TerraformResource set(String key, boolean value) {
+ values.put(key, new BooleanTerraformValue(value));
+ return this;
+ }
+
+ public TerraformResource set(String key, int value) {
+ values.put(key, new IntegerTerraformValue(value));
+ return this;
+ }
+
+ public TerraformResource setExpression(String key, String value) {
+ values.put(key, new ExpressionTerraformValue(value));
+ return this;
+ }
+
+ public ArrayTerraformValue array(String key) {
+ var array = new ArrayTerraformValue();
+ values.put(key, array);
+ return array;
+ }
+
+ public String asString() {
+ var buf = new StringBuilder();
+
+ buf.append("resource ");
+ 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("}");
+
+ 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<TerraformValue> values = new ArrayList<>();
+
+ @JsonValue
+ public List<TerraformValue> 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);
+ }
+}