1import * as parametermanager from "@distilled.cloud/gcp/parametermanager_v1";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import type { ParametersVersion } from "./ParametersVersion.ts";
5import { RenderParameterVersion } from "./RenderParameterVersion.ts";
6import { bindGcpHost } from "../Host.ts";
7import { grantFor } from "../HttpBinding.ts";
8
9/**
10 * HTTP implementation of {@link RenderParameterVersion}.
11 *
12 * @layer
13 * @provides GCP.ParameterManager.RenderParameterVersion
14 */
15export const RenderParameterVersionHttp = Layer.effect(
16 RenderParameterVersion,
17 Effect.gen(function* () {
18 const render =
19 yield* parametermanager.renderProjectsLocationsParametersVersions;
20 return Effect.fn(function* (version: ParametersVersion) {
21 yield* bindGcpHost({
22 tag: "GCP.ParameterManager.RenderParameterVersion",
23 resource: version,
24 // Parameter Manager has no resource-level IAM; an IAM Condition on
25 // the version name scopes the project grant to this version.
26 iam: [
27 grantFor(
28 {
29 role: "roles/parametermanager.parameterAccessor",
30 scopeByCondition: true,
31 },
32 version.name,
33 ),
34 ],
35 });
36 const name = yield* version.name;
37 return Effect.fn(
38 `GCP.ParameterManager.RenderParameterVersion(${version.LogicalId})`,
39 )(function* () {
40 return yield* render({ name: yield* name });
41 });
42 });
43 }),
44);