import { get, set } from '@dikolab/private-parts'; import { UsecaseSymbol } from '../../symbol/classes/usecase-symbol.class'; import { NAME_KEY, ROLES_KEY, } from '../../utils/constants/symbol-keys.constant'; import { ACTOR_TYPE } from '../../utils/constants/symbol-tag.constant'; import type { ActorModel } from '../types/actor-model.interface'; import type { AnyRole, RoleNames } from '../types/utility.type'; import type { ActorEventMap } from '../types/actor-events.type'; /** * Represents a named actor with assigned roles * that determine which use cases it can perform */ export class Actor< Name extends string, Roles extends readonly AnyRole[], > extends UsecaseSymbol implements ActorModel { get [ROLES_KEY](): Roles { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return get(this, ROLES_KEY); } constructor(name: Name, roles: Roles) { super(ACTOR_TYPE, name); set(this, ROLES_KEY, roles); } /** Returns a plain object with type, name, and role names */ toJSON() { const roles = this[ROLES_KEY].map((role) => role[NAME_KEY]); return { ...super.toJSON(), roles: roles as RoleNames, }; } }