1import * as autoscaling from "@distilled.cloud/aws/auto-scaling";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Binding from "../../Binding.ts";
5import { isInstance } from "../EC2/Instance.ts";
6import { isBindingHost } from "../Lambda/Function.ts";
7import type { AutoScalingGroup } from "./AutoScalingGroup.ts";
8import { DescribeAutoScalingGroup } from "./DescribeAutoScalingGroup.ts";
9
10// Bespoke (not the shared scaffold): `describeAutoScalingGroups` takes the
11// group name inside the `AutoScalingGroupNames` array and the client unwraps
12// the single-element response.
13export const DescribeAutoScalingGroupHttp = Layer.effect(
14 DescribeAutoScalingGroup,
15 Effect.gen(function* () {
16 const describe = yield* autoscaling.describeAutoScalingGroups;
17
18 return Effect.fn(function* (group: AutoScalingGroup) {
19 const AutoScalingGroupName = yield* group.autoScalingGroupName;
20 if (!globalThis.__ALCHEMY_RUNTIME__) {
21 const host = yield* Binding.Host;
22 if (isBindingHost(host) || isInstance(host)) {
23 yield* host.bind`Allow(${host}, AWS.AutoScaling.DescribeAutoScalingGroup(${group}))`(
24 {
25 policyStatements: [
26 {
27 Effect: "Allow",
28 Action: ["autoscaling:DescribeAutoScalingGroups"],
29 Resource: ["*"],
30 },
31 ],
32 },
33 );
34 }
35 }
36 return Effect.fn(
37 `AWS.AutoScaling.DescribeAutoScalingGroup(${group.LogicalId})`,
38 )(function* () {
39 const result = yield* describe({
40 AutoScalingGroupNames: [yield* AutoScalingGroupName],
41 });
42 return result.AutoScalingGroups?.[0];
43 });
44 });
45 }),
46);