import { Base64BitFlagDefinitionFactory, FlagDefinition } from '~/definitions' import { Base64BitFlagSet } from '~/flagsets' import { applyDeclarations, FlagWithOrdinal, ListOfFlagsWithOrdinal, NamedFlagWithOrdinal, } from './declarative' import { FlagSetBuilder } from './generic' import { DefineWithOrdinal, RequireParentsOrDefineWithOrdinal, WithOrdinal, WithOrdinalOrCompose, } from './syntax' import { InvalidOperationError } from '~/errors' export class Base64BitFlagSetBuilder implements WithOrdinalOrCompose, RequireParentsOrDefineWithOrdinal { private readonly _underlying: FlagSetBuilder public constructor() { this._underlying = new FlagSetBuilder() } public define(): WithOrdinal public define(alias: string): WithOrdinalOrCompose public define(alias?: string): WithOrdinalOrCompose { this._underlying.define(alias) return this } public compose(...flags: string[]): DefineWithOrdinal { this._underlying.compose(flags) return this } public withValue(): never { throw new InvalidOperationError('withValue') } public withOrdinal( ordinal: number, ): RequireParentsOrDefineWithOrdinal { this._underlying.withValue(ordinal) return this } public requires(...flags: string[]): DefineWithOrdinal { this._underlying.requires(flags) return this } public getResult(): Base64BitFlagSet { const graph = this._underlying.finish() const factory = new Base64BitFlagDefinitionFactory() return new Base64BitFlagSet(graph.intoDictionary(factory)) } } export function createBase64BitFlagSet(declarations: FlagWithOrdinal[]): Base64BitFlagSet export function createBase64BitFlagSet( declarations: Record, ): Base64BitFlagSet & Record> export function createBase64BitFlagSet(declarations: ListOfFlagsWithOrdinal): Base64BitFlagSet { const builder = new Base64BitFlagSetBuilder() applyDeclarations(declarations, builder) return builder.getResult() }