UNPKG

ifc-expressions

Version:

Parsing and evaluation of IFC expressions

48 lines (47 loc) 2.85 kB
import { Func } from "../Func.js"; import { FuncArg } from "../FuncArg.js"; import { ExprEvalFunctionEvaluationObjectNotFoundErrorObj, ExprEvalMissingRequiredFunctionArgumentErrorObj, ExprEvalStatus, ExprEvalSuccessObj, ExprEvalTypeErrorObj, } from "../../ExprEvalResult.js"; import { ObjectAccessorValue } from "../../../value/ObjectAccessorValue.js"; import { ExprKind } from "../../ExprKind.js"; import { FuncArgObjectAccessor } from "../arg/FuncArgObjectAccessor.js"; import { StringValue } from "../../../value/StringValue.js"; import { isNullish } from "../../../util/IfcExpressionUtils.js"; import { Type, Types } from "../../../type/Types.js"; export class PROPERTY extends Func { constructor() { super("PROPERTY", [ new FuncArgObjectAccessor(true, PROPERTY.KEY_OBJECT_REF, Types.or(Type.IFC_ELEMENT_REF, Type.IFC_PROPERTY_SET_REF, Type.IFC_TYPE_OBJECT_REF)), new FuncArg(false, PROPERTY.KEY_PROPERTY_NAME), ]); } getReturnType(argumentTypes) { return Type.IFC_PROPERTY_REF; } calculateResult(callingExpr, evaluatedArguments) { const objectRef = evaluatedArguments .get(PROPERTY.KEY_OBJECT_REF) .getValue(); const accessorFun = objectRef["getIfcPropertyAccessor"]; if (typeof accessorFun === "function") { const propertyNameVal = evaluatedArguments.get(PROPERTY.KEY_PROPERTY_NAME); if (typeof propertyNameVal === undefined) { return new ExprEvalMissingRequiredFunctionArgumentErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Cannot access property: no name specified", this.getName(), PROPERTY.KEY_PROPERTY_NAME, 1, callingExpr.getTextSpan()); } if (!StringValue.isStringValueType(propertyNameVal)) { return new ExprEvalTypeErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Property name must be a string", propertyNameVal, callingExpr.getTextSpan()); } const propertyName = propertyNameVal.stringValue; const resultingObjectAccessor = accessorFun.call(objectRef, propertyName); if (isNullish(resultingObjectAccessor)) { return new ExprEvalFunctionEvaluationObjectNotFoundErrorObj(ExprKind.FUNCTION, ExprEvalStatus.IFC_PROPERTY_NOT_FOUND, `No ifc property found with name '${propertyName}'`, this.getName(), propertyName, callingExpr.getTextSpan()); } else { return new ExprEvalSuccessObj(ObjectAccessorValue.of(resultingObjectAccessor)); } } return new ExprEvalTypeErrorObj(ExprKind.FUNCTION_ARGUMENTS, "Cannot evaluate function 'property' on the specified object", objectRef, callingExpr.getTextSpan()); } } PROPERTY.KEY_OBJECT_REF = "objectRef"; PROPERTY.KEY_PROPERTY_NAME = "propertyName"; //# sourceMappingURL=PROPERTY.js.map