diff --git a/muscript/src/main/java/io/gitlab/jfronny/muscript/optic/OEnum.java b/muscript/src/main/java/io/gitlab/jfronny/muscript/optic/OEnum.java new file mode 100644 index 0000000..b4698c3 --- /dev/null +++ b/muscript/src/main/java/io/gitlab/jfronny/muscript/optic/OEnum.java @@ -0,0 +1,52 @@ +package io.gitlab.jfronny.muscript.optic; + +import java.util.*; + +/** An enum represented as an OObject with automatic conversions to a number (index) and string (selected value) */ +public record OEnum(Map> values, OEnumEntry value) implements OObject { + public OEnum(List values, String value) { + this(createMap(values, value), new OEnumEntry(value, values.indexOf(value), true)); + } + + @Override + public Map> getValue() { + return values; + } + + @Override + public OString asString() { + return value; + } + + @Override + public ONumber asNumber() { + return value.asNumber(); + } + + private static Map> createMap(List values, String value) { + Map> result = new LinkedHashMap<>(); + OEnumEntry v = new OEnumEntry(value, values.indexOf(value), true); + result.put("value", v); + for (int i = 0; i < values.size(); i++) { + result.put(values.get(i), new OEnumEntry(values.get(i), i, values.get(i).equals(value))); + } + return Map.copyOf(result); + } + + public record OEnumEntry(String value, int index, boolean selected) implements OString { + @Override + public String getValue() { + return value; + } + + @Override + public ONumber asNumber() { + return OFinal.of(index); + } + + @Override + public OBool asBool() { + return OFinal.of(selected); + } + } +}