-module(caffeine_lang@codegen@dynatrace). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/caffeine_lang/codegen/dynatrace.gleam"). -export([terraform_settings/0, provider/0, variables/0, window_to_evaluation_window/1, ir_to_terraform_resource/1, generate_resources/1, generate_terraform/1]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -file("src/caffeine_lang/codegen/dynatrace.gleam", 40). ?DOC(false). -spec terraform_settings() -> terra_madre@terraform:terraform_settings(). terraform_settings() -> {terraform_settings, none, maps:from_list( [{<<"dynatrace"/utf8>>, {provider_requirement, <<"dynatrace-oss/dynatrace"/utf8>>, {some, <<"~> 1.0"/utf8>>}}}] ), none, none}. -file("src/caffeine_lang/codegen/dynatrace.gleam", 59). ?DOC(false). -spec provider() -> terra_madre@terraform:provider(). provider() -> {provider, <<"dynatrace"/utf8>>, none, maps:from_list( [{<<"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>>)}] ), []}. -file("src/caffeine_lang/codegen/dynatrace.gleam", 73). ?DOC(false). -spec variables() -> list(terra_madre@terraform:variable()). variables() -> [{variable, <<"dynatrace_env_url"/utf8>>, {some, {identifier, <<"string"/utf8>>}}, none, {some, <<"Dynatrace environment URL"/utf8>>}, none, none, []}, {variable, <<"dynatrace_api_token"/utf8>>, {some, {identifier, <<"string"/utf8>>}}, none, {some, <<"Dynatrace API token"/utf8>>}, {some, true}, none, []}]. -file("src/caffeine_lang/codegen/dynatrace.gleam", 164). ?DOC(" Build a description string for the SLO.\n"). -spec build_description(caffeine_lang@linker@ir:intermediate_representation()) -> binary(). build_description(Ir) -> Runbook = case caffeine_lang@linker@ir:get_slo_fields(erlang:element(6, Ir)) of {some, Slo} -> erlang:element(7, Slo); none -> none end, case Runbook of {some, Url} -> <<<<"[Runbook]("/utf8, Url/binary>>/binary, ")"/utf8>>; none -> <<<<<<<<<<<<"Managed by Caffeine ("/utf8, (erlang:element(3, erlang:element(2, Ir)))/binary>>/binary, "/"/utf8>>/binary, (erlang:element(6, erlang:element(2, Ir)))/binary>>/binary, "/"/utf8>>/binary, (erlang:element(4, erlang:element(2, Ir)))/binary>>/binary, ")"/utf8>> end. -file("src/caffeine_lang/codegen/dynatrace.gleam", 186). ?DOC(false). -spec window_to_evaluation_window(integer()) -> binary(). window_to_evaluation_window(Days) -> <<<<"-"/utf8, (erlang:integer_to_binary(Days))/binary>>/binary, "d"/utf8>>. -file("src/caffeine_lang/codegen/dynatrace.gleam", 99). ?DOC(false). -spec ir_to_terraform_resource( caffeine_lang@linker@ir:intermediate_representation() ) -> {ok, terra_madre@terraform:resource()} | {error, caffeine_lang@errors:compilation_error()}. ir_to_terraform_resource(Ir) -> Identifier = caffeine_lang@linker@ir:ir_to_identifier(Ir), Resource_name = terra_madre@common:sanitize_terraform_identifier( erlang:element(3, Ir) ), gleam@result:'try'( begin _pipe = caffeine_lang@linker@ir:get_slo_fields( erlang:element(6, Ir) ), gleam@option:to_result( _pipe, {generator_terraform_resolution_error, <<"dynatrace"/utf8>>, <<<<"expectation '"/utf8, Identifier/binary>>/binary, "' - missing SLO artifact data"/utf8>>, caffeine_lang@errors:empty_context()} ) end, fun(Slo) -> gleam@result:'try'( begin _pipe@1 = erlang:element(5, Slo), gleam@option:to_result( _pipe@1, {generator_terraform_resolution_error, <<"dynatrace"/utf8>>, <<<<"expectation '"/utf8, Identifier/binary>>/binary, "' - missing evaluation for Dynatrace SLO"/utf8>>, caffeine_lang@errors:empty_context()} ) end, fun(Evaluation_expr) -> gleam@result:'try'( begin _pipe@2 = caffeine_query_language@generator:resolve_slo_to_expression( Evaluation_expr, erlang:element(3, Slo) ), gleam@result:map_error( _pipe@2, fun(Err) -> {generator_terraform_resolution_error, <<"dynatrace"/utf8>>, <<<<<<"expectation '"/utf8, Identifier/binary>>/binary, "' - "/utf8>>/binary, Err/binary>>, caffeine_lang@errors:empty_context()} end ) end, fun(Metric_expression) -> Evaluation_window = window_to_evaluation_window( erlang:element(4, Slo) ), Description = build_description(Ir), Resource = {resource, <<"dynatrace_slo_v2"/utf8>>, Resource_name, maps:from_list( [{<<"name"/utf8>>, {string_literal, erlang:element( 2, erlang:element(2, Ir) )}}, {<<"enabled"/utf8>>, {bool_literal, true}}, {<<"custom_description"/utf8>>, {string_literal, Description}}, {<<"evaluation_type"/utf8>>, {string_literal, <<"AGGREGATE"/utf8>>}}, {<<"evaluation_window"/utf8>>, {string_literal, Evaluation_window}}, {<<"metric_expression"/utf8>>, {string_literal, Metric_expression}}, {<<"metric_name"/utf8>>, {string_literal, Resource_name}}, {<<"target_success"/utf8>>, {float_literal, erlang:element(2, Slo)}}] ), [], terra_madre@hcl:empty_meta(), none}, {ok, Resource} end ) end ) end ). -file("src/caffeine_lang/codegen/dynatrace.gleam", 32). ?DOC(false). -spec generate_resources( list(caffeine_lang@linker@ir:intermediate_representation()) ) -> {ok, list(terra_madre@terraform:resource())} | {error, caffeine_lang@errors:compilation_error()}. generate_resources(Irs) -> _pipe = Irs, gleam@list:try_map(_pipe, fun ir_to_terraform_resource/1). -file("src/caffeine_lang/codegen/dynatrace.gleam", 18). ?DOC(" Generate Terraform HCL from a list of Dynatrace IntermediateRepresentations.\n"). -spec generate_terraform( list(caffeine_lang@linker@ir:intermediate_representation()) ) -> {ok, binary()} | {error, caffeine_lang@errors:compilation_error()}. generate_terraform(Irs) -> gleam@result:'try'( generate_resources(Irs), fun(Resources) -> {ok, caffeine_lang@codegen@generator_utils:render_terraform_config( Resources, terraform_settings(), [provider()], variables() )} end ).