import { type Parameter } from '../../RTD' import { type Directive, type Identity } from './types' export class Rule implements Directive { private readonly directives: Directive[] = [] public constructor (directives: Record, create: Create) { for (const [name, value] of Object.entries(directives)) { const directive = create(name, value) this.directives.push(directive) } } public async authorize (identity: Identity | null, input: any, parameters: Parameter[]): Promise { for (const directive of this.directives) { const authorized = await directive.authorize(identity, input, parameters) if (!authorized) return false } return true } } type Create = (name: string, value: any, ...args: any[]) => Directive