ifc-expressions
Version:
Parsing and evaluation of IFC expressions
68 lines (67 loc) • 2.59 kB
JavaScript
import { Func } from "../Func.js";
import { FuncArgAny } from "../arg/FuncArgAny.js";
import { ExprEvalFunctionEvaluationErrorObj, ExprEvalStatus, ExprEvalSuccessObj, } from "../../ExprEvalResult.js";
import { StringValue } from "../../../value/StringValue.js";
import { Type } from "../../../type/Types.js";
import { NumericValue } from "../../../value/NumericValue.js";
import { BooleanValue } from "../../../value/BooleanValue.js";
import { LogicalValue } from "../../../value/LogicalValue.js";
import { ReferenceValue } from "../../../value/ReferenceValue.js";
export class TOBOOLEAN extends Func {
constructor() {
super("TOBOOLEAN", [new FuncArgAny(true, "object")]);
}
calculateResult(callingExpr, evaluatedArguments) {
const val = evaluatedArguments.get("object");
try {
return new ExprEvalSuccessObj(BooleanValue.of(this.convert(val)));
}
catch (e) {
return new ExprEvalFunctionEvaluationErrorObj(callingExpr.getKind(), ExprEvalStatus.ERROR, `Cannot convert ${val.getValue()} to boolean: ${e.message}`, this.name, callingExpr.getTextSpan());
}
}
convert(value) {
if (value instanceof BooleanValue) {
return value.getValue();
}
if (value instanceof StringValue || value instanceof ReferenceValue) {
switch (value.getValue()) {
case "TRUE":
case "true":
case "1":
return true;
case "FALSE":
case "false":
case "0":
return false;
default:
throw new Error(`Not a boolean value: ${value.getValue()}`);
}
}
if (value instanceof NumericValue) {
const val = value.getValue();
if (val.isZero()) {
return false;
}
if (val.toNumber() === 1) {
return true;
}
throw new Error("Can only convert 0 or 1 to boolean");
}
if (value instanceof LogicalValue) {
const val = value.getValue();
if (val === true) {
return true;
}
if (val === false) {
return false;
}
throw new Error("Can only convert 0 or 1 to boolean");
}
throw new Error(`numeric conversion not implemented for type ${value.constructor.name}`);
}
getReturnType(argumentTypes) {
return Type.BOOLEAN;
}
}
//# sourceMappingURL=TOBOOLEAN.js.map