import { Context, Effect } from "effect"; import type { ChangeRequest, ChangeRequestState, SourceControlProviderError, SourceControlProviderKind, SourceControlRepositoryCloneUrls, } from "@t3tools/contracts"; export interface SourceControlProviderShape { readonly kind: SourceControlProviderKind; readonly listChangeRequests: (input: { readonly cwd: string; readonly headSelector: string; readonly state: ChangeRequestState | "all"; readonly limit?: number; }) => Effect.Effect, SourceControlProviderError>; readonly getChangeRequest: (input: { readonly cwd: string; readonly reference: string; }) => Effect.Effect; readonly createChangeRequest: (input: { readonly cwd: string; readonly baseRefName: string; readonly headSelector: string; readonly title: string; readonly bodyFile: string; }) => Effect.Effect; readonly getRepositoryCloneUrls: (input: { readonly cwd: string; readonly repository: string; }) => Effect.Effect; readonly getDefaultBranch: (input: { readonly cwd: string; }) => Effect.Effect; readonly checkoutChangeRequest: (input: { readonly cwd: string; readonly reference: string; readonly force?: boolean; }) => Effect.Effect; } export class SourceControlProvider extends Context.Service< SourceControlProvider, SourceControlProviderShape >()("t3/source-control/SourceControlProvider") {}