1import {
2 ProviderDriverKind,
3 ProviderInstanceId,
4 type ProviderInstanceEnvironment,
5} from "@t3tools/contracts";
6import * as Schema from "effect/Schema";
7import type * as Effect from "effect/Effect";
8import type * as Scope from "effect/Scope";
9
10import type * as ProviderAdapter from "@t3tools/provider-core/server/ProviderAdapter";
11
12export class ProviderAdapterDriverCreateError extends Schema.TaggedError<ProviderAdapterDriverCreateError>()(
13 "ProviderAdapterDriverCreateError",
14 {
15 driver: ProviderDriverKind,
16 instanceId: ProviderInstanceId,
17 detail: Schema.String,
18 cause: Schema.optional(Schema.Defect()),
19 },
20) {
21 override get message(): string {
22 return `Failed to create orchestration-v2 provider adapter ${this.instanceId} (${this.driver}): ${this.detail}`;
23 }
24}
25
26export interface ProviderAdapterDriverCreateInput<Config> {
27 readonly instanceId: ProviderInstanceId;
28 readonly displayName: string | undefined;
29 readonly accentColor?: string | undefined;
30 readonly environment: ProviderInstanceEnvironment;
31 readonly enabled: boolean;
32 readonly config: Config;
33}
34
35export interface ProviderAdapterDriver<Config, R = never> {
36 readonly driverKind: ProviderDriverKind;
37 readonly configSchema: Schema.Codec<Config, unknown>;
38 readonly defaultConfig: () => Config;
39 readonly create: (
40 input: ProviderAdapterDriverCreateInput<Config>,
41 ) => Effect.Effect<
42 ProviderAdapter.ProviderAdapterV2["Service"],
43 ProviderAdapterDriverCreateError,
44 R | Scope.Scope
45 >;
46}
47
48export type AnyProviderAdapterDriver<R = never> = ProviderAdapterDriver<any, R>;