import * as emrc from "@distilled.cloud/aws/emr-containers"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Binding from "../../Binding.ts"; import { isBindingHost } from "../Lambda/Function.ts"; import { virtualClusterPolicyStatement } from "./BindingHttp.ts"; import { StartJobRun } from "./StartJobRun.ts"; import type { VirtualCluster } from "./VirtualCluster.ts"; export const StartJobRunHttp = Layer.effect( StartJobRun, Effect.gen(function* () { const op = yield* emrc.startJobRun; // Bespoke (not the shared builder): `clientToken` is required on the wire // schema but auto-generated by the SDK's idempotency-token filling when // omitted, so the binding's request keeps it optional. return Effect.fn(function* (virtualCluster: VirtualCluster) { const VirtualClusterId = yield* virtualCluster.virtualClusterId; if (!globalThis.__ALCHEMY_RUNTIME__) { const host = yield* Binding.Host; if (isBindingHost(host)) { yield* host.bind`Allow(${host}, AWS.EMRContainers.StartJobRun(${virtualCluster}))`( { policyStatements: [ virtualClusterPolicyStatement(virtualCluster, [ "emr-containers:StartJobRun", ]), ], }, ); } } return Effect.fn( `AWS.EMRContainers.StartJobRun(${virtualCluster.LogicalId})`, )(function* ( request: Omit< emrc.StartJobRunRequest, "virtualClusterId" | "clientToken" > & { clientToken?: string }, ) { return yield* op({ ...request, virtualClusterId: yield* VirtualClusterId, } as emrc.StartJobRunRequest); }); }); }), );