-module(caffeine_lang@codegen@platforms). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/caffeine_lang/codegen/platforms.gleam"). -export([all/0, for_vendor/1, terraform_settings/1, provider/1, generate_terraform/2]). -export_type([platform/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -type platform() :: {platform, caffeine_lang@analysis@vendor:vendor(), binary(), binary(), binary(), list({binary(), terra_madre@hcl:expr()}), list(terra_madre@terraform:variable()), fun((list(caffeine_lang@linker@ir:intermediate_representation(caffeine_lang@linker@ir:resolved()))) -> {ok, {list(terra_madre@terraform:resource()), list(binary())}} | {error, caffeine_lang@errors:compilation_error()})}. -file("src/caffeine_lang/codegen/platforms.gleam", 175). -spec typed_var(binary(), binary(), binary(), boolean()) -> terra_madre@terraform:variable(). typed_var(Name, Type_, Description, Sensitive) -> {variable, Name, {some, {identifier, Type_}}, none, {some, Description}, case Sensitive of true -> {some, true}; false -> none end, none, []}. -file("src/caffeine_lang/codegen/platforms.gleam", 199). -spec plain_string(binary(), binary()) -> terra_madre@terraform:variable(). plain_string(Name, Description) -> typed_var(Name, <<"string"/utf8>>, Description, false). -file("src/caffeine_lang/codegen/platforms.gleam", 195). -spec sensitive_string(binary(), binary()) -> terra_madre@terraform:variable(). sensitive_string(Name, Description) -> typed_var(Name, <<"string"/utf8>>, Description, true). -file("src/caffeine_lang/codegen/platforms.gleam", 144). -spec newrelic_platform() -> platform(). newrelic_platform() -> {platform, new_relic, <<"newrelic"/utf8>>, <<"newrelic/newrelic"/utf8>>, <<"~> 3.0"/utf8>>, [{<<"account_id"/utf8>>, terra_madre@hcl:ref(<<"var.newrelic_account_id"/utf8>>)}, {<<"api_key"/utf8>>, terra_madre@hcl:ref(<<"var.newrelic_api_key"/utf8>>)}, {<<"region"/utf8>>, terra_madre@hcl:ref(<<"var.newrelic_region"/utf8>>)}], [typed_var( <<"newrelic_account_id"/utf8>>, <<"number"/utf8>>, <<"New Relic account ID"/utf8>>, false ), sensitive_string( <<"newrelic_api_key"/utf8>>, <<"New Relic API key"/utf8>> ), {variable, <<"newrelic_region"/utf8>>, {some, {identifier, <<"string"/utf8>>}}, {some, {string_literal, <<"US"/utf8>>}}, {some, <<"New Relic region"/utf8>>}, none, none, []}, plain_string( <<"newrelic_entity_guid"/utf8>>, <<"New Relic entity GUID"/utf8>> )], fun caffeine_lang@codegen@newrelic:generate_resources/1}. -file("src/caffeine_lang/codegen/platforms.gleam", 126). -spec dynatrace_platform() -> platform(). dynatrace_platform() -> {platform, dynatrace, <<"dynatrace"/utf8>>, <<"dynatrace-oss/dynatrace"/utf8>>, <<"~> 1.0"/utf8>>, [{<<"dt_env_url"/utf8>>, terra_madre@hcl:ref(<<"var.dynatrace_env_url"/utf8>>)}, {<<"dt_api_token"/utf8>>, terra_madre@hcl:ref(<<"var.dynatrace_api_token"/utf8>>)}], [plain_string( <<"dynatrace_env_url"/utf8>>, <<"Dynatrace environment URL"/utf8>> ), sensitive_string( <<"dynatrace_api_token"/utf8>>, <<"Dynatrace API token"/utf8>> )], fun caffeine_lang@codegen@dynatrace:generate_resources/1}. -file("src/caffeine_lang/codegen/platforms.gleam", 111). -spec honeycomb_platform() -> platform(). honeycomb_platform() -> {platform, honeycomb, <<"honeycombio"/utf8>>, <<"honeycombio/honeycombio"/utf8>>, <<"~> 0.31"/utf8>>, [{<<"api_key"/utf8>>, terra_madre@hcl:ref(<<"var.honeycomb_api_key"/utf8>>)}], [sensitive_string( <<"honeycomb_api_key"/utf8>>, <<"Honeycomb API key"/utf8>> ), plain_string( <<"honeycomb_dataset"/utf8>>, <<"Honeycomb dataset slug"/utf8>> )], fun caffeine_lang@codegen@honeycomb:generate_resources/1}. -file("src/caffeine_lang/codegen/platforms.gleam", 93). -spec datadog_platform() -> platform(). datadog_platform() -> {platform, datadog, <<"datadog"/utf8>>, <<"DataDog/datadog"/utf8>>, <<"~> 3.0"/utf8>>, [{<<"api_key"/utf8>>, terra_madre@hcl:ref(<<"var.datadog_api_key"/utf8>>)}, {<<"app_key"/utf8>>, terra_madre@hcl:ref(<<"var.datadog_app_key"/utf8>>)}], [sensitive_string( <<"datadog_api_key"/utf8>>, <<"Datadog API key"/utf8>> ), sensitive_string( <<"datadog_app_key"/utf8>>, <<"Datadog Application key"/utf8>> )], fun caffeine_lang@codegen@datadog:generate_resources/1}. -file("src/caffeine_lang/codegen/platforms.gleam", 34). ?DOC(" All supported platforms. Order is stable for deterministic output.\n"). -spec all() -> list(platform()). all() -> [datadog_platform(), honeycomb_platform(), dynatrace_platform(), newrelic_platform()]. -file("src/caffeine_lang/codegen/platforms.gleam", 40). ?DOC( " Look up the platform configuration for a given vendor.\n" " Total: every Vendor variant has a corresponding Platform.\n" ). -spec for_vendor(caffeine_lang@analysis@vendor:vendor()) -> platform(). for_vendor(V) -> P@2 = case gleam@list:find(all(), fun(P) -> erlang:element(2, P) =:= V end) of {ok, P@1} -> P@1; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"caffeine_lang/codegen/platforms"/utf8>>, function => <<"for_vendor"/utf8>>, line => 41, value => _assert_fail, start => 1484, 'end' => 1544, pattern_start => 1495, pattern_end => 1500}) end, P@2. -file("src/caffeine_lang/codegen/platforms.gleam", 46). ?DOC(" Derive the TerraformSettings block for a platform.\n"). -spec terraform_settings(platform()) -> terra_madre@terraform:terraform_settings(). terraform_settings(P) -> {terraform_settings, none, maps:from_list( [{erlang:element(3, P), {provider_requirement, erlang:element(4, P), {some, erlang:element(5, P)}}}] ), none, none}. -file("src/caffeine_lang/codegen/platforms.gleam", 64). ?DOC(" Derive the Provider block for a platform.\n"). -spec provider(platform()) -> terra_madre@terraform:provider(). provider(P) -> {provider, erlang:element(3, P), none, maps:from_list(erlang:element(6, P)), []}. -file("src/caffeine_lang/codegen/platforms.gleam", 75). ?DOC( " Generate complete Terraform output (boilerplate + resources) for a platform.\n" " Used in tests to produce full HCL for a single vendor in isolation.\n" ). -spec generate_terraform( platform(), list(caffeine_lang@linker@ir:intermediate_representation(caffeine_lang@linker@ir:resolved())) ) -> {ok, {binary(), list(binary())}} | {error, caffeine_lang@errors:compilation_error()}. generate_terraform(P, Irs) -> gleam@result:'try'( (erlang:element(8, P))(Irs), fun(_use0) -> {Resources, Warnings} = _use0, {ok, {caffeine_lang@codegen@generator_utils:render_terraform_config( Resources, terraform_settings(P), [provider(P)], erlang:element(7, P) ), Warnings}} end ).