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