1import { MssqlClient } from "@effect/sql-mssql"
2import { MSSQLServerContainer } from "@testcontainers/mssqlserver"
3import { Context, Data, Effect, Layer, Redacted } from "effect"
4
5export class ContainerError extends Data.TaggedError("ContainerError")<{
6 cause: unknown
7}> {}
8
9export class MssqlContainer extends Context.Service<MssqlContainer>()("test/MssqlContainer", {
10 make: Effect.acquireRelease(
11 Effect.tryPromise({
12 try: () =>
13 new MSSQLServerContainer("mcr.microsoft.com/mssql/server:2022-latest")
14 .acceptLicense()
15 .start(),
16 catch: (cause) => new ContainerError({ cause })
17 }),
18 (container) => Effect.promise(() => container.stop())
19 )
20}) {
21 static readonly layer = Layer.effect(this)(this.make)
22
23 static layerClient = Layer.unwrap(
24 Effect.gen(function*() {
25 const container = yield* MssqlContainer
26 return MssqlClient.layer({
27 server: container.getHost(),
28 port: container.getPort(),
29 database: container.getDatabase(),
30 username: container.getUsername(),
31 password: Redacted.make(container.getPassword()),
32 trustServer: true
33 })
34 })
35 ).pipe(Layer.provide(this.layer))
36}