/* eslint-disable @typescript-eslint/no-explicit-any */ import type { EntityData, EntityDataRegistry } from './entity-data'; import { DisposableImpl } from '@gedit/utils'; import type { Entity } from './entity'; import { getHandleParams } from './playground-decorator-helper'; import type { EntityManager } from './entity-manager'; interface AbleHandle

{ handle(data1: EntityData, payload: P): void handle(data1: EntityData, data2: EntityData, payload: P): void handle(data1: EntityData, data2: EntityData, data3: EntityData, payload: P): void handle(data1: EntityData, data2: EntityData, data3: EntityData, data4: EntityData, payload: P): void handle(data1: EntityData, data2: EntityData, data3: EntityData, data4: EntityData, data5: EntityData, payload: P): void } // eslint-disable-next-line @typescript-eslint/no-explicit-any export abstract class Able

extends DisposableImpl implements AbleHandle

{ static type = 'Able'; constructor( protected entity: Entity ) { super(); this.entityManager = entity.entityManager; } /** * 类型名称 */ get type(): string { if (!(this.constructor as any).type) { throw new Error('Able Registry need a type: ' + this.constructor.name); } return (this.constructor as any).type; } payload: P; /** * handle 和 before 执行之前, 且只执行一次 * @param entities - 所有绑定该able的实体列表 * @param payload * @return 返回新的payload, undefined则会阻断handle执行 */ static globalBefore?(entities: Entity[], payload: any): any | undefined /** * handle执行之前, 每个实体都是执行 * @return 返回新的payload, undefined则会阻断handle执行 */ before?(payload: P): P | undefined /** * 消费payload */ abstract handle(...args: any[]): void; /** * handle执行之后 */ after?(payload: P): void /** * handle 和 before 执行之后, 且只执行一次 * @param payload * @param entities - 所有绑定该able的实体列表 */ static globalAfter?(entities: Entity[], payload: any): void /** * 获取当前Able注册的数据 * @param registry */ getParam(registry: EntityDataRegistry): D { const params = getHandleParams(this.constructor as any); if (!params.find(p => p === registry)) { throw new Error('Unregistry param: ' + registry.type); } return this.entity.getData(registry)!; } entityManager: EntityManager; } export type AblePayload = Required['payload']; /** * Able注册器 */ export interface AbleRegistry { readonly type: A['type'], new( ...args: any[] ): A }