import { Schema } from "effect"; import { PositiveInt, TrimmedNonEmptyString } from "./baseSchemas.ts"; import { VcsDriverKind } from "./vcs.ts"; export const SourceControlProviderKind = Schema.Literals([ "github", "gitlab", "azure-devops", "bitbucket", "unknown", ]); export type SourceControlProviderKind = typeof SourceControlProviderKind.Type; export const SourceControlProviderInfo = Schema.Struct({ kind: SourceControlProviderKind, name: TrimmedNonEmptyString, baseUrl: Schema.String, }); export type SourceControlProviderInfo = typeof SourceControlProviderInfo.Type; export const ChangeRequestState = Schema.Literals(["open", "closed", "merged"]); export type ChangeRequestState = typeof ChangeRequestState.Type; export const ChangeRequest = Schema.Struct({ provider: SourceControlProviderKind, number: PositiveInt, title: TrimmedNonEmptyString, url: Schema.String, baseRefName: TrimmedNonEmptyString, headRefName: TrimmedNonEmptyString, state: ChangeRequestState, updatedAt: Schema.Option(Schema.DateTimeUtc), isCrossRepository: Schema.optional(Schema.Boolean), headRepositoryNameWithOwner: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)), headRepositoryOwnerLogin: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)), }); export type ChangeRequest = typeof ChangeRequest.Type; export const SourceControlRepositoryCloneUrls = Schema.Struct({ nameWithOwner: TrimmedNonEmptyString, url: TrimmedNonEmptyString, sshUrl: TrimmedNonEmptyString, }); export type SourceControlRepositoryCloneUrls = typeof SourceControlRepositoryCloneUrls.Type; export const SourceControlDiscoveryStatus = Schema.Literals(["available", "missing"]); export type SourceControlDiscoveryStatus = typeof SourceControlDiscoveryStatus.Type; export const SourceControlProviderAuthStatus = Schema.Literals([ "authenticated", "unauthenticated", "unknown", ]); export type SourceControlProviderAuthStatus = typeof SourceControlProviderAuthStatus.Type; export const SourceControlProviderAuth = Schema.Struct({ status: SourceControlProviderAuthStatus, account: Schema.Option(TrimmedNonEmptyString), host: Schema.Option(TrimmedNonEmptyString), detail: Schema.Option(TrimmedNonEmptyString), }); export type SourceControlProviderAuth = typeof SourceControlProviderAuth.Type; const SourceControlDiscoveryItemFields = { label: TrimmedNonEmptyString, executable: TrimmedNonEmptyString, implemented: Schema.Boolean, status: SourceControlDiscoveryStatus, version: Schema.Option(TrimmedNonEmptyString), installHint: TrimmedNonEmptyString, detail: Schema.Option(TrimmedNonEmptyString), } as const; export const SourceControlDiscoveryItem = Schema.Struct({ kind: Schema.String, ...SourceControlDiscoveryItemFields, }); export type SourceControlDiscoveryItem = typeof SourceControlDiscoveryItem.Type; export const VcsDiscoveryItem = Schema.Struct({ kind: VcsDriverKind, ...SourceControlDiscoveryItemFields, }); export type VcsDiscoveryItem = typeof VcsDiscoveryItem.Type; export const SourceControlProviderDiscoveryItem = Schema.Struct({ kind: SourceControlProviderKind, ...SourceControlDiscoveryItemFields, auth: SourceControlProviderAuth, }); export type SourceControlProviderDiscoveryItem = typeof SourceControlProviderDiscoveryItem.Type; export const SourceControlDiscoveryResult = Schema.Struct({ versionControlSystems: Schema.Array(VcsDiscoveryItem), sourceControlProviders: Schema.Array(SourceControlProviderDiscoveryItem), }); export type SourceControlDiscoveryResult = typeof SourceControlDiscoveryResult.Type; export class SourceControlProviderError extends Schema.TaggedErrorClass()( "SourceControlProviderError", { provider: SourceControlProviderKind, operation: Schema.String, detail: Schema.String, cause: Schema.optional(Schema.Defect), }, ) { override get message(): string { return `Source control provider ${this.provider} failed in ${this.operation}: ${this.detail}`; } }