Packages
caffeine_lang
2.0.2
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang@generator@datadog.erl
-module(caffeine_lang@generator@datadog).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/generator/datadog.gleam").
-export([terraform_settings/0, provider/0, variables/0, window_to_timeframe/1, ir_to_terraform_resource/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/generator/datadog.gleam", 45).
?DOC(false).
-spec terraform_settings() -> terra_madre@terraform:terraform_settings().
terraform_settings() ->
{terraform_settings,
none,
maps:from_list(
[{<<"datadog"/utf8>>,
{provider_requirement,
<<"DataDog/datadog"/utf8>>,
{some, <<"~> 3.0"/utf8>>}}}]
),
none,
none}.
-file("src/caffeine_lang/generator/datadog.gleam", 61).
?DOC(false).
-spec provider() -> terra_madre@terraform:provider().
provider() ->
{provider,
<<"datadog"/utf8>>,
none,
maps:from_list(
[{<<"api_key"/utf8>>,
terra_madre@hcl:ref(<<"var.datadog_api_key"/utf8>>)},
{<<"app_key"/utf8>>,
terra_madre@hcl:ref(<<"var.datadog_app_key"/utf8>>)}]
),
[]}.
-file("src/caffeine_lang/generator/datadog.gleam", 75).
?DOC(false).
-spec variables() -> list(terra_madre@terraform:variable()).
variables() ->
[{variable,
<<"datadog_api_key"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"Datadog API key"/utf8>>},
{some, true},
none,
[]},
{variable,
<<"datadog_app_key"/utf8>>,
{some, {identifier, <<"string"/utf8>>}},
none,
{some, <<"Datadog Application key"/utf8>>},
{some, true},
none,
[]}].
-file("src/caffeine_lang/generator/datadog.gleam", 193).
?DOC(false).
-spec window_to_timeframe(integer()) -> {ok, binary()} |
{error, caffeine_lang@common@errors:compilation_error()}.
window_to_timeframe(Days) ->
Days_string = erlang:integer_to_binary(Days),
case Days of
7 ->
{ok, <<Days_string/binary, "d"/utf8>>};
30 ->
{ok, <<Days_string/binary, "d"/utf8>>};
90 ->
{ok, <<Days_string/binary, "d"/utf8>>};
_ ->
{error,
{generator_datadog_terraform_resolution_error,
<<<<"Illegal window_in_days value: "/utf8,
Days_string/binary>>/binary,
". Accepted values are 7, 30, or 90."/utf8>>}}
end.
-file("src/caffeine_lang/generator/datadog.gleam", 101).
?DOC(false).
-spec ir_to_terraform_resource(
caffeine_lang@middle_end@semantic_analyzer:intermediate_representation()
) -> {ok, terra_madre@terraform:resource()} |
{error, caffeine_lang@common@errors:compilation_error()}.
ir_to_terraform_resource(Ir) ->
Resource_name = terra_madre@common:sanitize_terraform_identifier(
erlang:element(3, Ir)
),
Threshold = begin
_pipe = caffeine_lang@common@helpers:extract_value(
erlang:element(5, Ir),
<<"threshold"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_float/1}
),
gleam@result:unwrap(_pipe, 99.9)
end,
Window_in_days = begin
_pipe@1 = caffeine_lang@common@helpers:extract_value(
erlang:element(5, Ir),
<<"window_in_days"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_int/1}
),
gleam@result:unwrap(_pipe@1, 30)
end,
Queries = begin
_pipe@2 = caffeine_lang@common@helpers:extract_value(
erlang:element(5, Ir),
<<"queries"/utf8>>,
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
{decoder, fun gleam@dynamic@decode:decode_string/1}
)
),
gleam@result:unwrap(_pipe@2, maps:new())
end,
Value_expr = begin
_pipe@3 = caffeine_lang@common@helpers:extract_value(
erlang:element(5, Ir),
<<"value"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
gleam@result:unwrap(_pipe@3, <<"numerator / denominator"/utf8>>)
end,
gleam@result:'try'(
begin
_pipe@4 = caffeine_query_language@generator:resolve_slo_to_hcl(
Value_expr,
Queries
),
gleam@result:map_error(
_pipe@4,
fun(Err) ->
{generator_slo_query_resolution_error,
<<<<<<"Failed to resolve SLO query for '"/utf8,
(erlang:element(2, erlang:element(2, Ir)))/binary>>/binary,
"': "/utf8>>/binary,
Err/binary>>}
end
)
end,
fun(_use0) ->
{resolved_slo_hcl, Slo_type, Slo_blocks} = _use0,
Tags = {list_expr,
begin
_pipe@5 = [{string_literal, <<"managed_by:caffeine"/utf8>>},
{string_literal,
<<"caffeine_version:"/utf8,
(<<"2.0.2"/utf8>>)/binary>>},
{string_literal,
<<"org:"/utf8,
(erlang:element(3, erlang:element(2, Ir)))/binary>>},
{string_literal,
<<"team:"/utf8,
(erlang:element(6, erlang:element(2, Ir)))/binary>>},
{string_literal,
<<"service:"/utf8,
(erlang:element(4, erlang:element(2, Ir)))/binary>>},
{string_literal,
<<"blueprint:"/utf8,
(erlang:element(5, erlang:element(2, Ir)))/binary>>},
{string_literal,
<<"expectation:"/utf8,
(erlang:element(2, erlang:element(2, Ir)))/binary>>},
{string_literal,
<<"artifact:"/utf8, (erlang:element(4, Ir))/binary>>}],
lists:append(
_pipe@5,
begin
_pipe@6 = erlang:element(7, erlang:element(2, Ir)),
_pipe@7 = maps:keys(_pipe@6),
_pipe@8 = gleam@list:sort(
_pipe@7,
fun gleam@string:compare/2
),
gleam@list:map(
_pipe@8,
fun(Key) ->
Value@1 = case begin
_pipe@9 = erlang:element(
7,
erlang:element(2, Ir)
),
gleam_stdlib:map_get(_pipe@9, Key)
end of
{ok, Value} -> Value;
_assert_fail ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"caffeine_lang/generator/datadog"/utf8>>,
function => <<"ir_to_terraform_resource"/utf8>>,
line => 157,
value => _assert_fail,
start => 4896,
'end' => 4952,
pattern_start => 4907,
pattern_end => 4916}
)
end,
{string_literal,
<<<<Key/binary, ":"/utf8>>/binary,
Value@1/binary>>}
end
)
end
)
end},
gleam@result:'try'(
window_to_timeframe(Window_in_days),
fun(Window_in_days_string) ->
Thresholds_block = terra_madre@hcl:simple_block(
<<"thresholds"/utf8>>,
[{<<"timeframe"/utf8>>,
{string_literal, Window_in_days_string}},
{<<"target"/utf8>>, {float_literal, Threshold}}]
),
Type_str = case Slo_type of
time_slice_slo ->
<<"time_slice"/utf8>>;
metric_slo ->
<<"metric"/utf8>>
end,
{ok,
{resource,
<<"datadog_service_level_objective"/utf8>>,
Resource_name,
maps:from_list(
[{<<"name"/utf8>>,
{string_literal,
erlang:element(
2,
erlang:element(2, Ir)
)}},
{<<"type"/utf8>>,
{string_literal, Type_str}},
{<<"tags"/utf8>>, Tags}]
),
lists:append(Slo_blocks, [Thresholds_block]),
terra_madre@hcl:empty_meta(),
none}}
end
)
end
).
-file("src/caffeine_lang/generator/datadog.gleam", 25).
?DOC(
" Generate Terraform HCL from a list of Datadog IntermediateRepresentations.\n"
" Includes provider configuration and variables.\n"
).
-spec generate_terraform(
list(caffeine_lang@middle_end@semantic_analyzer:intermediate_representation())
) -> {ok, binary()} | {error, caffeine_lang@common@errors:compilation_error()}.
generate_terraform(Irs) ->
gleam@result:'try'(
begin
_pipe = Irs,
gleam@list:try_map(_pipe, fun ir_to_terraform_resource/1)
end,
fun(Resources) ->
Config = {config,
{some, terraform_settings()},
[provider()],
Resources,
[],
variables(),
[],
[],
[]},
{ok, terra_madre@render:render_config(Config)}
end
).