1import * as firebaserules from "@distilled.cloud/gcp/firebaserules_v1";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import {
5 GetReleaseExecutable,
6 type GetReleaseExecutableRequest,
7} from "./GetReleaseExecutable.ts";
8import type { Release } from "./Release.ts";
9import { bindGcpHost } from "../Host.ts";
10
11/**
12 * HTTP implementation of {@link GetReleaseExecutable}.
13 *
14 * Grants `roles/firebaserules.admin` on the project because it is the
15 * narrowest predefined role containing `firebaserules.releases.getExecutable`, and Firebase
16 * Rules has no resource-level IAM.
17 *
18 * @layer
19 * @provides GCP.FirebaseRules.GetReleaseExecutable
20 */
21export const GetReleaseExecutableHttp = Layer.effect(
22 GetReleaseExecutable,
23 Effect.gen(function* () {
24 const getExecutableProjectsReleases =
25 yield* firebaserules.getExecutableProjectsReleases;
26 return Effect.fn(function* (release: Release) {
27 yield* bindGcpHost({
28 tag: "GCP.FirebaseRules.GetReleaseExecutable",
29 resource: release,
30 iam: [{ role: "roles/firebaserules.admin" }],
31 });
32 const name = yield* release.name;
33 return Effect.fn(
34 `GCP.FirebaseRules.GetReleaseExecutable(${release.LogicalId})`,
35 )(function* (request: GetReleaseExecutableRequest = {}) {
36 return yield* getExecutableProjectsReleases({
37 ...request,
38 name: yield* name,
39 });
40 });
41 });
42 }),
43);