import { SPI } from '@oinone/kunlun-spi'; import { isEmpty, isString } from 'lodash-es'; import { Expression } from '../Expression'; import type { ExpressionRunParam } from '../ExpressionDefinition'; import { type ExpressionExecutorService, ExpressionExecutorServiceToken } from './ExpressionExecutorService'; @SPI.Service(ExpressionExecutorServiceToken, { name: '__default__', priority: 0 }) export class DefaultExpressionExecutorService implements ExpressionExecutorService { public run(param: ExpressionRunParam, expression: string, errorValue?: T): T | string | undefined { if (!isString(expression) || isEmpty(expression)) { return expression; } Expression.getInstance().initExpressionContext( param.activeRecords, param.rootRecord, param.openerRecord, param.scene, param.activeRecord, param.parentRecord ); try { return Expression.getInstance().exec(expression) as T; } catch (e) { console.error(`Unable to parse expression: ${expression}`); return errorValue; } finally { Expression.getInstance().cleanupExpressionContext(); } return expression; } }