1import * as emrc from "@distilled.cloud/aws/emr-containers";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Binding from "../../Binding.ts";
5import { isBindingHost } from "../Lambda/Function.ts";
6import { DescribeVirtualCluster } from "./DescribeVirtualCluster.ts";
7import type { VirtualCluster } from "./VirtualCluster.ts";
8
9/**
10 * Bespoke (not scaffold-built): `describeVirtualCluster` addresses the
11 * virtual cluster itself via `id` rather than carrying a `virtualClusterId`
12 * field, and the grant is on the cluster ARN alone (no sub-resource
13 * pattern).
14 */
15export const DescribeVirtualClusterHttp = Layer.effect(
16 DescribeVirtualCluster,
17 Effect.gen(function* () {
18 const op = yield* emrc.describeVirtualCluster;
19
20 return Effect.fn(function* (virtualCluster: VirtualCluster) {
21 // Outputs yield a DEFERRED effect — resolve again per invocation below.
22 const VirtualClusterId = yield* virtualCluster.virtualClusterId;
23 if (!globalThis.__ALCHEMY_RUNTIME__) {
24 const host = yield* Binding.Host;
25 if (isBindingHost(host)) {
26 yield* host.bind`Allow(${host}, AWS.EMRContainers.DescribeVirtualCluster(${virtualCluster}))`(
27 {
28 policyStatements: [
29 {
30 Effect: "Allow",
31 Action: ["emr-containers:DescribeVirtualCluster"],
32 Resource: [virtualCluster.virtualClusterArn],
33 },
34 ],
35 },
36 );
37 }
38 }
39 return Effect.fn(
40 `AWS.EMRContainers.DescribeVirtualCluster(${virtualCluster.LogicalId})`,
41 )(function* () {
42 return yield* op({ id: yield* VirtualClusterId });
43 });
44 });
45 }),
46);