import { SSMClient, GetParametersCommand } from '@aws-sdk/client-ssm'
import * as Layer from '@effect/io/Layer'
import * as Context from '@effect/data/Context'
import * as Effect from '@effect/io/Effect'
import { pipe } from '@effect/data/Function'
const SSMClientService = Context.Tag<SSMClient>('@aws-sdk/client-ssm.SSMClient')
const readParams = <
const Mappings extends Record<string, string>,
KeyName extends keyof Mappings,
Alias extends Mappings[KeyName]
>(
mappings: Mappings
): Effect.Effect<SSMClient, unknown, { [K in Alias]: string }> =>
pipe(
Effect.contextWith<SSMClient, SSMClient>((x) => x),
Effect.flatMap((ctx) =>
Effect.promise(async () => {
const command = new GetParametersCommand({
Names: Object.keys(mappings),
WithDecryption: true,
})
const response = await ctx.send(command)
let ret = {} as { [K in Alias]: string }
response.Parameters?.forEach((param) => {
// @ts-ignore
ret[mappings[param.Name]] = param.Value
})
return ret
})
)
)
const ok = pipe(
{ '/some/path': 'SOME_NAME' } as const,
readParams,
Effect.provideLayer(
Layer.effect(SSMClientService, Effect.succeed(new SSMClient({})))
)
)
import { SSMClient, GetParametersCommand } from '@aws-sdk/client-ssm'
import * as Layer from '@effect/io/Layer'
import * as Context from '@effect/data/Context'
import * as Effect from '@effect/io/Effect'
import { pipe } from '@effect/data/Function'
const SSMClientService = Context.Tag<SSMClient>('@aws-sdk/client-ssm.SSMClient')
const readParams = <
const Mappings extends Record<string, string>,
KeyName extends keyof Mappings,
Alias extends Mappings[KeyName]
>(
mappings: Mappings
): Effect.Effect<SSMClient, unknown, { [K in Alias]: string }> =>
pipe(
Effect.contextWith<SSMClient, SSMClient>((x) => x),
Effect.flatMap((ctx) =>
Effect.promise(async () => {
const command = new GetParametersCommand({
Names: Object.keys(mappings),
WithDecryption: true,
})
const response = await ctx.send(command)
let ret = {} as { [K in Alias]: string }
response.Parameters?.forEach((param) => {
// @ts-ignore
ret[mappings[param.Name]] = param.Value
})
return ret
})
)
)
const ok = pipe(
{ '/some/path': 'SOME_NAME' } as const,
readParams,
Effect.provideLayer(
Layer.effect(SSMClientService, Effect.succeed(new SSMClient({})))
)
)