import type { Container } from "@codemation/core"; import type { CodemationClassRegistration, CodemationContainerRegistration, CodemationValueRegistration, } from "./CodemationContainerRegistration"; export class CodemationContainerRegistrationRegistrar { apply(container: Container, registrations: ReadonlyArray>): void { for (const registration of registrations) { this.applyRegistration(container, registration); } } private applyRegistration(container: Container, registration: CodemationContainerRegistration): void { if (this.isValueRegistration(registration)) { container.registerInstance(registration.token, registration.useValue); return; } if (this.isClassRegistration(registration)) { container.registerSingleton(registration.token as never, registration.useClass as never); return; } container.register(registration.token, { useFactory: (dependencyContainer) => registration.useFactory(dependencyContainer), }); } private isValueRegistration( registration: CodemationContainerRegistration, ): registration is CodemationValueRegistration { return "useValue" in registration; } private isClassRegistration( registration: CodemationContainerRegistration, ): registration is CodemationClassRegistration { return "useClass" in registration; } }