import type { PrependTuple, StringifyTuple } from '../../utils/types/utility.type'; import type { ActorModel } from './actor-model.interface'; import type { RoleModel } from './role-model.interface'; export type RoleName = Source extends RoleModel ? Name : 'Role:Unknown'; export type AnyRole = RoleModel; export type ResolveRole = Source extends string ? RoleModel : Source extends RoleModel ? RoleModel : never; export type ResolveRoles = Sources extends [ infer First, ...infer Others ] ? First extends AnyRole | string ? PrependTuple, ResolveRole> : [...ResolveRoles] : Sources extends [infer First] ? First extends AnyRole | string ? [ResolveRole] : [] : []; export type RoleNames = Sources extends readonly [infer First] ? [RoleName] : Sources extends readonly [infer First, ...infer Others] ? [RoleName, ...RoleNames] : Sources extends readonly RoleModel[] ? U[] : []; export type StringifyRoles = Sources extends readonly [ infer First ] ? StringifyTuple> : Sources extends readonly [infer First, ...infer Others] ? `${StringifyTuple>}` : Sources extends readonly RoleModel[] ? `${U}` : ''; export type ResolveRoleName = Source extends string ? Source : Source extends RoleModel ? Name : never; export type ResolveRoleNames = Sources extends [ infer First, ...infer Others ] ? First extends AnyRole | string ? PrependTuple, ResolveRoleName> : [...ResolveRoleNames] : Sources extends [infer First] ? First extends AnyRole | string ? [ResolveRoleName] : [] : []; export type AnyActor = ActorModel; export type ActorRoles = Actor extends ActorModel ? Roles : []; export type ActorName = Actor extends ActorModel ? Name : 'Actor:Unknown'; export type ActorRoleOptions = readonly RoleModel>[number]>[];