1import * as binaryauthorization from "@distilled.cloud/gcp/binaryauthorization_v1";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import {
5 EvaluateGkePolicy,
6 type EvaluateGkePolicyRequest,
7} from "./EvaluateGkePolicy.ts";
8import type { PlatformsPolicy } from "./PlatformsPolicy.ts";
9import { bindGcpHost } from "../Host.ts";
10
11/**
12 * HTTP implementation of {@link EvaluateGkePolicy}.
13 *
14 * @layer
15 * @provides GCP.BinaryAuthorization.EvaluateGkePolicy
16 */
17export const EvaluateGkePolicyHttp = Layer.effect(
18 EvaluateGkePolicy,
19 Effect.gen(function* () {
20 const evaluate =
21 yield* binaryauthorization.evaluateProjectsPlatformsGkePolicies;
22 return Effect.fn(function* (policy: PlatformsPolicy) {
23 yield* bindGcpHost({
24 tag: "GCP.BinaryAuthorization.EvaluateGkePolicy",
25 resource: policy,
26 // Platform policies have no resource-level IAM.
27 iam: [{ role: "roles/binaryauthorization.policyEvaluator" }],
28 });
29 const name = yield* policy.name;
30 return Effect.fn(
31 `GCP.BinaryAuthorization.EvaluateGkePolicy(${policy.LogicalId})`,
32 )(function* (request: EvaluateGkePolicyRequest) {
33 return yield* evaluate({
34 name: yield* name,
35 body: request,
36 });
37 });
38 });
39 }),
40);