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", 111).
-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", 131).
-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", 91).
-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", 32).
?DOC(
" All supported platforms. Order is stable for deterministic output.\n"
" New vendors are added by appending another `*_platform()` constructor here.\n"
).
-spec all() -> list(platform()).
all() ->
[datadog_platform()].
-file("src/caffeine_lang/codegen/platforms.gleam", 38).
?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 => 39,
value => _assert_fail,
start => 1383,
'end' => 1443,
pattern_start => 1394,
pattern_end => 1399})
end,
P@2.
-file("src/caffeine_lang/codegen/platforms.gleam", 44).
?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", 62).
?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", 73).
?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
).