package io.gitlab.jfronny.muscript; import io.gitlab.jfronny.muscript.data.Scope; import io.gitlab.jfronny.muscript.data.dynamic.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import static io.gitlab.jfronny.muscript.data.dynamic.DFinal.of; public class StandardLib { private static final Random rnd = new Random(); public static final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); public static final SimpleDateFormat dateFormat = new SimpleDateFormat("dd. MM. yyyy"); public static Scope createScope() { return addTo(new Scope()); } public static Scope addTo(Scope scope) { return scope .set("PI", Math.PI) .set("time", timeFormat.format(new Date())) .set("date", dateFormat.format(new Date())) .set("round", StandardLib::round) .set("floor", StandardLib::floor) .set("ceil", StandardLib::ceil) .set("abs", StandardLib::abs) .set("random", StandardLib::random) .set("toUpper", StandardLib::toUpper) .set("toLower", StandardLib::toLower) .set("contains", StandardLib::contains) .set("replace", StandardLib::replace) .set("listOf", StandardLib::listOf); } // Numbers public static DNumber round(DList args) { if (args.size() == 1) { return of(Math.round(args.get(0).asNumber().getValue())); } else if (args.size() == 2) { double x = Math.pow(10, (int) (double) args.get(1).asNumber().getValue()); return of(Math.round(args.get(0).asNumber().getValue() * x) / x); } else { throw new IllegalArgumentException("Invalid number of arguments for round: expected 1 or 2 but got " + args.size()); } } public static DNumber floor(DList args) { if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for floor: expected 1 but got " + args.size()); return of(Math.floor(args.get(0).asNumber().getValue())); } public static DNumber ceil(DList args) { if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for ceil: expected 1 but got " + args.size()); return of(Math.ceil(args.get(0).asNumber().getValue())); } public static DNumber abs(DList args) { if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for abs: expected 1 but got " + args.size()); return of(Math.abs(args.get(0).asNumber().getValue())); } public static DNumber random(DList args) { if (args.size() == 0) return of(rnd.nextDouble()); else if (args.size() == 2) { double min = args.get(0).asNumber().getValue(); double max = args.get(1).asNumber().getValue(); return of(min + (max - min) * rnd.nextDouble()); } throw new IllegalArgumentException("Invalid number of arguments for random: expected 0 or 2 but got " + args.size()); } // Strings public static DString toUpper(DList args) { if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for toUpper: expected 1 but got " + args.size()); return of(args.get(0).asString().getValue().toUpperCase()); } public static DString toLower(DList args) { if (args.size() != 1) throw new IllegalArgumentException("Invalid number of arguments for toLower: expected 1 but got " + args.size()); return of(args.get(0).asString().getValue().toLowerCase()); } public static DBool contains(DList args) { if (args.size() != 2) throw new IllegalArgumentException("Invalid number of arguments for contains: expected 2 but got " + args.size()); return of(args.get(0).asString().getValue().contains(args.get(1).asString().getValue())); } public static DString replace(DList args) { if (args.size() != 3) throw new IllegalArgumentException("Invalid number of arguments for replace: expected 3 but got " + args.size()); return of(args.get(0).asString().getValue().replace(args.get(1).asString().getValue(), args.get(2).asString().getValue())); } // Misc public static DList listOf(DList args) { return args; } }