mirror of
https://github.com/Horizontal42/summarum.git
synced 2026-11-10 19:11:58 +03:00
Merge bfd9a84616 into 37cfd2144b
This commit is contained in:
commit
8b091ddd87
1 changed files with 68 additions and 54 deletions
|
|
@ -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);
|
||||||
|
|
@ -383,26 +382,31 @@ function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value {
|
||||||
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
|
||||||
|
|
@ -411,6 +415,16 @@ function evalConv(v: Value, target: ConvTarget, ctx: EvalCtx): Value {
|
||||||
: 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue