Refactor overly long evalConv function by extracting logic into helper functions.

Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
This commit is contained in:
google-labs-jules[bot] 2026-09-04 07:17:38 +00:00
parent 37cfd2144b
commit bfd9a84616

View file

@ -355,16 +355,15 @@ function evalPctOp(op: string, l: Value, r: Value): Value {
throw new EvalError(`bad percent op ${op}`); throw new EvalError(`bad percent op ${op}`);
} }
function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value { function evalConvUnit(v: Value, target: Extract<ConvTarget, { type: "unit" }>): Value {
switch (target.type) {
case "unit": {
if (v.kind === "percent") return pct(v.value); // "x in %" — keep if (v.kind === "percent") return pct(v.value); // "x in %" — keep
if (v.kind !== "quantity") if (v.kind !== "quantity")
throw new EvalError("cannot convert date to unit"); throw new EvalError("cannot convert date to unit");
if (!v.unit) return qty(v.value, target.unit); if (!v.unit) return qty(v.value, target.unit);
return convertQ(v, target.unit); return convertQ(v, target.unit);
} }
case "currency": {
function evalConvCurrency(v: Value, target: Extract<ConvTarget, { type: "currency" }>, ctx: EvalCtx): Value {
let unit; let unit;
if (target.onDate) { if (target.onDate) {
const dateRates = ctx.historicalRates?.get(target.onDate); const dateRates = ctx.historicalRates?.get(target.onDate);
@ -382,27 +381,32 @@ function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value {
throw new EvalError("cannot convert to currency"); throw new EvalError("cannot convert to currency");
if (!v.unit) return qty(v.value, unit); if (!v.unit) return qty(v.value, unit);
return convertQ(v, unit); return convertQ(v, unit);
} }
case "repr": {
function evalConvRepr(v: Value, target: Extract<ConvTarget, { type: "repr" }>): Value {
if (v.kind !== "quantity") throw new EvalError("bad repr conversion"); if (v.kind !== "quantity") throw new EvalError("bad repr conversion");
return { ...v, repr: target.repr }; return { ...v, repr: target.repr };
} }
case "scale": {
function evalConvScale(v: Value, target: Extract<ConvTarget, { type: "scale" }>): Value {
if (v.kind !== "quantity") throw new EvalError("bad scale conversion"); if (v.kind !== "quantity") throw new EvalError("bad scale conversion");
return qty(v.value.div(target.mult), v.unit); // formatter shows plain number return qty(v.value.div(target.mult), v.unit); // formatter shows plain number
} }
case "tz": {
function evalConvTz(v: Value, target: Extract<ConvTarget, { type: "tz" }>): Value {
const zone = resolveZone(target.words); const zone = resolveZone(target.words);
if (!zone) throw new EvalError("unknown timezone"); if (!zone) throw new EvalError("unknown timezone");
if (v.kind !== "date") throw new EvalError("timezone needs a time"); if (v.kind !== "date") throw new EvalError("timezone needs a time");
return { ...v, timeZone: zone }; return { ...v, timeZone: zone };
} }
case "unix": {
function evalConvUnix(v: Value): Value {
if (v.kind === "date") if (v.kind === "date")
return qty(new Decimal(v.ms).div(1000).floor(), null, "plain"); return qty(new Decimal(v.ms).div(1000).floor(), null, "plain");
throw new EvalError("unix needs a date"); throw new EvalError("unix needs a date");
} }
case "todate": {
function evalConvToDate(v: Value): Value {
if (v.kind !== "quantity" || v.unit) if (v.kind !== "quantity" || v.unit)
throw new EvalError("date needs a plain number"); throw new EvalError("date needs a plain number");
// heuristics: > 1e12 means milliseconds, else seconds // heuristics: > 1e12 means milliseconds, else seconds
@ -410,7 +414,17 @@ function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value {
? v.value.toNumber() ? v.value.toNumber()
: v.value.mul(1000).toNumber(); : v.value.mul(1000).toNumber();
return { kind: "date", ms, hasTime: true }; return { kind: "date", ms, hasTime: true };
} }
function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value {
switch (target.type) {
case "unit": return evalConvUnit(v, target);
case "currency": return evalConvCurrency(v, target, ctx);
case "repr": return evalConvRepr(v, target);
case "scale": return evalConvScale(v, target);
case "tz": return evalConvTz(v, target);
case "unix": return evalConvUnix(v);
case "todate": return evalConvToDate(v);
} }
} }