1import * as Layer from "effect/Layer";
2import * as Provider from "../Provider.ts";
3import { Container, ContainerProvider } from "./Container.ts";
4import { Context, ContextProvider } from "./Context.ts";
5import { DockerLive } from "./Docker.ts";
6import { Image, ImageProvider } from "./Image.ts";
7import { Network, NetworkProvider } from "./Network.ts";
8import { RemoteImage, RemoteImageProvider } from "./RemoteImage.ts";
9import { Service, ServiceProvider } from "./Service.ts";
10import { Swarm, SwarmProvider } from "./Swarm.ts";
11import { Volume, VolumeProvider } from "./Volume.ts";
12
13export class Providers extends Provider.ProviderCollection<Providers>()(
14 "Docker",
15) {}
16
17export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
18
19/**
20 * Registers all Docker resource providers.
21 *
22 * Docker providers use the active Docker CLI context and are intentionally
23 * separate from `Cloudflare.Container`.
24 */
25export const providers = () =>
26 Layer.effect(
27 Providers,
28 Provider.collection([
29 Container,
30 Image,
31 Network,
32 RemoteImage,
33 Volume,
34 Context,
35 Service,
36 Swarm,
37 ]),
38 ).pipe(
39 Layer.provide(
40 Layer.mergeAll(
41 ContainerProvider(),
42 ImageProvider(),
43 NetworkProvider(),
44 RemoteImageProvider(),
45 VolumeProvider(),
46 ContextProvider(),
47 ServiceProvider(),
48 SwarmProvider(),
49 ),
50 ),
51 Layer.provideMerge(DockerLive),
52 );