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

70 lines
2.2 KiB
Java

package io.gitlab.jfronny.muscript.data.dynamic.additional;
import io.gitlab.jfronny.muscript.ast.DynamicExpr;
import io.gitlab.jfronny.muscript.ast.dynamic.Call;
import io.gitlab.jfronny.muscript.ast.dynamic.Variable;
import io.gitlab.jfronny.muscript.ast.literal.NumberLiteral;
import io.gitlab.jfronny.muscript.compiler.CodeLocation;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import io.gitlab.jfronny.muscript.data.dynamic.lens.DNumberLens;
import io.gitlab.jfronny.muscript.data.dynamic.lens.DStringLens;
import io.gitlab.jfronny.muscript.data.dynamic.type.*;
import java.time.LocalTime;
import java.util.*;
import java.util.function.Supplier;
import static io.gitlab.jfronny.muscript.data.dynamic.type.DSL.*;
public record DTime(Supplier<LocalTime> time) implements DObject {
public static final DType SIGNATURE = object(NUMBER).or(STRING).or(NUMBER);
@Override
public Map<String, Dynamic> getValue() {
return Map.of(
"hour", DFinal.of(time.get().getHour()),
"minute", DFinal.of(time.get().getMinute()),
"second", DFinal.of(time.get().getSecond())
);
}
@Override
public boolean isString() {
return true;
}
@Override
public DString asString() {
return new DStringLens(this, this::toString);
}
@Override
public boolean isNumber() {
return true;
}
@Override
public DNumber asNumber() {
return new DNumberLens(this, () -> time.get().toSecondOfDay());
}
@Override
public DynamicExpr toExpr() {
return new Call(CodeLocation.NONE, new Variable(CodeLocation.NONE, "time"), List.of(
new Call.Arg(new NumberLiteral(CodeLocation.NONE, time.get().getHour()).asDynamicExpr(), false),
new Call.Arg(new NumberLiteral(CodeLocation.NONE, time.get().getMinute()).asDynamicExpr(), false),
new Call.Arg(new NumberLiteral(CodeLocation.NONE, time.get().getSecond()).asDynamicExpr(), false)
));
}
@Override
public DType getSignature() {
return SIGNATURE;
}
@Override
public String toString() {
return time.get().toString();
}
}