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 time) implements DObject { public static final DType SIGNATURE = object(NUMBER).or(STRING).or(NUMBER); @Override public Map 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(); } }