UNPKG

ifc-expressions

Version:

Parsing and evaluation of IFC expressions

72 lines (71 loc) 2.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TOBOOLEAN = void 0; const Func_js_1 = require("../Func.js"); const FuncArgAny_js_1 = require("../arg/FuncArgAny.js"); const ExprEvalResult_js_1 = require("../../ExprEvalResult.js"); const StringValue_js_1 = require("../../../value/StringValue.js"); const Types_js_1 = require("../../../type/Types.js"); const NumericValue_js_1 = require("../../../value/NumericValue.js"); const BooleanValue_js_1 = require("../../../value/BooleanValue.js"); const LogicalValue_js_1 = require("../../../value/LogicalValue.js"); const ReferenceValue_js_1 = require("../../../value/ReferenceValue.js"); class TOBOOLEAN extends Func_js_1.Func { constructor() { super("TOBOOLEAN", [new FuncArgAny_js_1.FuncArgAny(true, "object")]); } calculateResult(callingExpr, evaluatedArguments) { const val = evaluatedArguments.get("object"); try { return new ExprEvalResult_js_1.ExprEvalSuccessObj(BooleanValue_js_1.BooleanValue.of(this.convert(val))); } catch (e) { return new ExprEvalResult_js_1.ExprEvalFunctionEvaluationErrorObj(callingExpr.getKind(), ExprEvalResult_js_1.ExprEvalStatus.ERROR, `Cannot convert ${val.getValue()} to boolean: ${e.message}`, this.name, callingExpr.getTextSpan()); } } convert(value) { if (value instanceof BooleanValue_js_1.BooleanValue) { return value.getValue(); } if (value instanceof StringValue_js_1.StringValue || value instanceof ReferenceValue_js_1.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_js_1.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_js_1.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 Types_js_1.Type.BOOLEAN; } } exports.TOBOOLEAN = TOBOOLEAN; //# sourceMappingURL=TOBOOLEAN.js.map