java-commons/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DEnum.java

89 lines
2.6 KiB
Java

package io.gitlab.jfronny.muscript.data.dynamic.additional;
import io.gitlab.jfronny.commons.StringFormatter;
import io.gitlab.jfronny.muscript.compiler.ExprWriter;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.*;
/**
* An enum represented as an OObject.
* May also have a selected value with automatic conversions to a number (index) and string
*/
public record DEnum(Map<String, Dynamic<?>> values, @Nullable DEnumEntry value) implements DObject {
public DEnum(Map<String, Dynamic<?>> values) {
this(values, (DEnumEntry) null);
}
public DEnum(Map<String, Dynamic<?>> values, @Nullable String value) {
this(values, value == null ? null : new DEnumEntry(value, values.keySet().stream().toList().indexOf(value), true));
}
public DEnum(List<String> values, String value) {
this(createMap(values, value), value == null ? null : new DEnumEntry(value, values.indexOf(value), true));
}
public DEnum(List<String> values) {
this(values, null);
}
@Override
public Map<String, Dynamic<?>> getValue() {
return values;
}
@Override
public DList asList() {
return DFinal.of(List.copyOf(values.values()));
}
@Override
public DString asString() {
return value != null ? value : DFinal.of(StringFormatter.toString(values));
}
@Override
public DNumber asNumber() {
return value != null ? value.asNumber() : DObject.super.asNumber();
}
@Override
public void serialize(ExprWriter writer) throws IOException {
writer.append("enum(");
DObject.super.serialize(writer);
if (value != null) {
writer.append(", ").append(value.value);
}
writer.append(')');
}
private static Map<String, Dynamic<?>> createMap(List<String> values, String value) {
Map<String, Dynamic<?>> result = new LinkedHashMap<>();
DEnumEntry v = new DEnumEntry(value, values.indexOf(value), true);
result.put("value", v);
for (int i = 0; i < values.size(); i++) {
result.put(values.get(i), new DEnumEntry(values.get(i), i, values.get(i).equals(value)));
}
return Map.copyOf(result);
}
public record DEnumEntry(String value, int index, boolean selected) implements DString {
@Override
public String getValue() {
return value;
}
@Override
public DNumber asNumber() {
return DFinal.of(index);
}
@Override
public DBool asBool() {
return DFinal.of(selected);
}
}
}