import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import { type VcsDriverKind, type VcsError, type VcsInitInput, VcsUnsupportedOperationError, } from "@t3tools/contracts"; import * as VcsDriverRegistry from "./VcsDriverRegistry.ts"; export class VcsProvisioningService extends Context.Service< VcsProvisioningService, { readonly initRepository: (input: VcsInitInput) => Effect.Effect; } >()("t3/vcs/VcsProvisioningService") {} function resolveRequestedKind( kind: VcsDriverKind | undefined, ): Effect.Effect { if (kind === undefined) { return Effect.succeed("git"); } if (kind === "unknown") { return Effect.fail( new VcsUnsupportedOperationError({ operation: "VcsProvisioningService.resolveRequestedKind", kind, detail: "A concrete VCS driver kind is required for repository provisioning.", }), ); } return Effect.succeed(kind); } /** @public Service construction is part of the canonical Effect module API. */ export const make = Effect.gen(function* () { const registry = yield* VcsDriverRegistry.VcsDriverRegistry; const initRepository: VcsProvisioningService["Service"]["initRepository"] = Effect.fn( "VcsProvisioningService.initRepository", )(function* (input) { const kind = yield* resolveRequestedKind(input.kind); const driver = yield* registry.get(kind); return yield* driver.initRepository(input); }); return VcsProvisioningService.of({ initRepository, }); }); export const layer = Layer.effect(VcsProvisioningService, make);