Current section

Files

Jump to
caffeine_lang src caffeine_lang@codegen@platforms.erl
Raw

src/caffeine_lang@codegen@platforms.erl

-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 => <<?FILEPATH/utf8>>,
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
).