Packages
caffeine_lang
1.0.1
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, extract_string/2, extract_float/2, extract_int/2, extract_dict_string_string/2, 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", 44).
?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", 60).
?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", 74).
?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", 172).
?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", 188).
?DOC(false).
-spec extract_string(list(caffeine_lang@common@helpers:value_tuple()), binary()) -> {ok,
binary()} |
{error, nil}.
extract_string(Values, Label) ->
_pipe = Values,
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) -> erlang:element(2, Vt) =:= Label end
),
_pipe@2 = gleam@list:first(_pipe@1),
gleam@result:'try'(
_pipe@2,
fun(Vt@1) ->
_pipe@3 = gleam@dynamic@decode:run(
erlang:element(4, Vt@1),
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
gleam@result:replace_error(_pipe@3, nil)
end
).
-file("src/caffeine_lang/generator/datadog.gleam", 202).
?DOC(false).
-spec extract_float(list(caffeine_lang@common@helpers:value_tuple()), binary()) -> {ok,
float()} |
{error, nil}.
extract_float(Values, Label) ->
_pipe = Values,
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) -> erlang:element(2, Vt) =:= Label end
),
_pipe@2 = gleam@list:first(_pipe@1),
gleam@result:'try'(
_pipe@2,
fun(Vt@1) ->
_pipe@3 = gleam@dynamic@decode:run(
erlang:element(4, Vt@1),
{decoder, fun gleam@dynamic@decode:decode_float/1}
),
gleam@result:replace_error(_pipe@3, nil)
end
).
-file("src/caffeine_lang/generator/datadog.gleam", 216).
?DOC(false).
-spec extract_int(list(caffeine_lang@common@helpers:value_tuple()), binary()) -> {ok,
integer()} |
{error, nil}.
extract_int(Values, Label) ->
_pipe = Values,
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) -> erlang:element(2, Vt) =:= Label end
),
_pipe@2 = gleam@list:first(_pipe@1),
gleam@result:'try'(
_pipe@2,
fun(Vt@1) ->
_pipe@3 = gleam@dynamic@decode:run(
erlang:element(4, Vt@1),
{decoder, fun gleam@dynamic@decode:decode_int/1}
),
gleam@result:replace_error(_pipe@3, nil)
end
).
-file("src/caffeine_lang/generator/datadog.gleam", 227).
?DOC(false).
-spec extract_dict_string_string(
list(caffeine_lang@common@helpers:value_tuple()),
binary()
) -> {ok, gleam@dict:dict(binary(), binary())} | {error, nil}.
extract_dict_string_string(Values, Label) ->
_pipe = Values,
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) -> erlang:element(2, Vt) =:= Label end
),
_pipe@2 = gleam@list:first(_pipe@1),
gleam@result:'try'(
_pipe@2,
fun(Vt@1) ->
_pipe@3 = gleam@dynamic@decode:run(
erlang:element(4, Vt@1),
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
{decoder, fun gleam@dynamic@decode:decode_string/1}
)
),
gleam@result:replace_error(_pipe@3, nil)
end
).
-file("src/caffeine_lang/generator/datadog.gleam", 100).
?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 = extract_float(erlang:element(5, Ir), <<"threshold"/utf8>>),
gleam@result:unwrap(_pipe, 99.9)
end,
Window_in_days = begin
_pipe@1 = extract_int(erlang:element(5, Ir), <<"window_in_days"/utf8>>),
gleam@result:unwrap(_pipe@1, 30)
end,
Queries = begin
_pipe@2 = extract_dict_string_string(
erlang:element(5, Ir),
<<"queries"/utf8>>
),
gleam@result:unwrap(_pipe@2, maps:new())
end,
Value_expr = begin
_pipe@3 = extract_string(erlang:element(5, Ir), <<"value"/utf8>>),
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,
[{string_literal, <<"managed_by:caffeine"/utf8>>},
{string_literal,
<<"caffeine_version:"/utf8, (<<"1.0.1"/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>>}]},
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", 24).
?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
).