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