Packages
caffeine_lang
0.0.9
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@phase_4@slo_resolver.erl
-module(caffeine_lang@phase_4@slo_resolver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/phase_4/slo_resolver.gleam").
-export([resolve_sli/2, resolve_slo/3, resolve_slos/1]).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 180).
-spec find_filter_type(caffeine_lang@types@ast@sli_type:sli_type(), binary()) -> {ok,
caffeine_lang@types@common@accepted_types:accepted_types()} |
{error, binary()}.
find_filter_type(Sli_type, Filter_name) ->
_pipe = erlang:element(5, Sli_type),
_pipe@1 = gleam@list:find(
_pipe,
fun(Basic_type) -> erlang:element(2, Basic_type) =:= Filter_name end
),
_pipe@2 = gleam@result:map(
_pipe@1,
fun(Basic_type@1) -> erlang:element(3, Basic_type@1) end
),
gleam@result:replace_error(_pipe@2, <<"Filter type not found"/utf8>>).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 205).
-spec parse_list_value(binary()) -> {ok, list(binary())} | {error, binary()}.
parse_list_value(Value) ->
Trimmed = gleam@string:trim(Value),
case gleam_stdlib:string_starts_with(Trimmed, <<"["/utf8>>) andalso gleam_stdlib:string_ends_with(
Trimmed,
<<"]"/utf8>>
) of
true ->
Inner = gleam@string:slice(Trimmed, 1, string:length(Trimmed) - 2),
Items = gleam@string:split(Inner, <<","/utf8>>),
Cleaned_items = begin
_pipe = Items,
_pipe@1 = gleam@list:map(_pipe, fun gleam@string:trim/1),
_pipe@2 = gleam@list:map(
_pipe@1,
fun(Item) ->
case gleam_stdlib:string_starts_with(
Item,
<<"\""/utf8>>
)
andalso gleam_stdlib:string_ends_with(
Item,
<<"\""/utf8>>
) of
true ->
gleam@string:slice(
Item,
1,
string:length(Item) - 2
);
false ->
Item
end
end
),
gleam@list:filter(
_pipe@2,
fun(Item@1) -> Item@1 /= <<""/utf8>> end
)
end,
{ok, Cleaned_items};
false ->
{error, <<"Not a list format"/utf8>>}
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 190).
-spec convert_list_to_or_expression(binary()) -> binary().
convert_list_to_or_expression(List_value) ->
case parse_list_value(List_value) of
{ok, Items} ->
case Items of
[] ->
List_value;
[Single] ->
Single;
_ ->
<<<<"("/utf8,
(gleam@string:join(Items, <<" OR "/utf8>>))/binary>>/binary,
")"/utf8>>
end;
{error, _} ->
List_value
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 165).
-spec process_filter_value(
binary(),
caffeine_lang@types@ast@sli_type:sli_type(),
binary()
) -> binary().
process_filter_value(Value, Sli_type, Filter_name) ->
case find_filter_type(Sli_type, Filter_name) of
{ok, {list, _}} ->
convert_list_to_or_expression(Value);
_ ->
Value
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 127).
-spec resolve_primary(
caffeine_lang@cql@parser:primary(),
gleam@dict:dict(binary(), binary())
) -> {ok, caffeine_lang@cql@parser:primary()} | {error, binary()}.
resolve_primary(Primary, Resolved_queries) ->
case Primary of
{primary_word, Word} ->
case Word of
{word, Word_value} ->
case gleam_stdlib:map_get(Resolved_queries, Word_value) of
{ok, Resolved_value} ->
case caffeine_lang@cql@parser:parse_expr(
Resolved_value
) of
{ok, Parsed_exp} ->
case Parsed_exp of
{exp_container, Exp} ->
{ok, {primary_exp, Exp}}
end;
{error, _} ->
{ok, {primary_word, {word, Resolved_value}}}
end;
{error, _} ->
{ok, {primary_word, Word}}
end
end;
{primary_exp, Exp@1} ->
gleam@result:'try'(
resolve_exp(Exp@1, Resolved_queries),
fun(Resolved_exp) -> {ok, {primary_exp, Resolved_exp}} end
)
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 110).
-spec resolve_exp(
caffeine_lang@cql@parser:exp(),
gleam@dict:dict(binary(), binary())
) -> {ok, caffeine_lang@cql@parser:exp()} | {error, binary()}.
resolve_exp(Exp, Resolved_queries) ->
case Exp of
{operator_expr, Left, Right, Op} ->
gleam@result:'try'(
resolve_exp(Left, Resolved_queries),
fun(Resolved_left) ->
gleam@result:'try'(
resolve_exp(Right, Resolved_queries),
fun(Resolved_right) ->
{ok,
{operator_expr,
Resolved_left,
Resolved_right,
Op}}
end
)
end
);
{primary, Primary} ->
gleam@result:'try'(
resolve_primary(Primary, Resolved_queries),
fun(Resolved_primary) -> {ok, {primary, Resolved_primary}} end
)
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 98).
-spec resolve_cql_query(
caffeine_lang@cql@parser:exp_container(),
gleam@dict:dict(binary(), binary())
) -> {ok, caffeine_lang@cql@parser:exp_container()} | {error, binary()}.
resolve_cql_query(Query, Resolved_queries) ->
case Query of
{exp_container, Exp} ->
gleam@result:'try'(
resolve_exp(Exp, Resolved_queries),
fun(Resolved_exp) -> {ok, {exp_container, Resolved_exp}} end
)
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 60).
-spec resolve_sli(
gleam@dict:dict(binary(), binary()),
caffeine_lang@types@ast@sli_type:sli_type()
) -> {ok, caffeine_lang@types@resolved@resolved_sli:sli()} | {error, binary()}.
resolve_sli(Filters, Sli_type) ->
Resolved_queries = begin
_pipe = erlang:element(4, Sli_type),
_pipe@1 = caffeine_lang@types@common@generic_dictionary:to_string_dict(
_pipe
),
_pipe@2 = maps:to_list(_pipe@1),
_pipe@4 = gleam@list:map(
_pipe@2,
fun(Pair) ->
{Metric_attribute, Template} = Pair,
Filter_names = maps:keys(Filters),
_pipe@3 = gleam@list:fold(
Filter_names,
Template,
fun(Acc, Name) ->
case gleam_stdlib:map_get(Filters, Name) of
{ok, Value} ->
Processed_value = process_filter_value(
Value,
Sli_type,
Name
),
gleam@string:replace(
Acc,
<<<<"$$"/utf8, Name/binary>>/binary,
"$$"/utf8>>,
Processed_value
);
{error, _} ->
Acc
end
end
),
(fun(Processed) -> {Metric_attribute, Processed} end)(_pipe@3)
end
),
maps:from_list(_pipe@4)
end,
gleam@result:'try'(
resolve_cql_query(
erlang:element(4, erlang:element(3, Sli_type)),
Resolved_queries
),
fun(Resolved_query) ->
{ok,
{sli,
erlang:element(3, Sli_type),
Resolved_queries,
Resolved_query}}
end
).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 34).
-spec resolve_slo(
caffeine_lang@types@ast@slo:slo(),
binary(),
list(caffeine_lang@types@ast@sli_type:sli_type())
) -> {ok, caffeine_lang@types@resolved@resolved_slo:slo()} | {error, binary()}.
resolve_slo(Slo, Team_name, Sli_types) ->
Sli_type@2 = case begin
_pipe = Sli_types,
gleam@list:find(
_pipe,
fun(Sli_type) ->
erlang:element(2, Sli_type) =:= erlang:element(4, Slo)
end
)
end of
{ok, Sli_type@1} -> Sli_type@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/phase_4/slo_resolver"/utf8>>,
function => <<"resolve_slo"/utf8>>,
line => 39,
value => _assert_fail,
start => 1047,
'end' => 1151,
pattern_start => 1058,
pattern_end => 1070})
end,
Filters_dict = caffeine_lang@types@common@generic_dictionary:to_string_dict(
erlang:element(2, Slo)
),
gleam@result:'try'(
resolve_sli(Filters_dict, Sli_type@2),
fun(Resolve_sli) ->
{ok,
{slo,
erlang:element(6, Slo),
erlang:element(3, Slo),
erlang:element(5, Slo),
Team_name,
Resolve_sli}}
end
).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 14).
-spec resolve_slos(caffeine_lang@types@ast@organization:organization()) -> {ok,
list(caffeine_lang@types@resolved@resolved_slo:slo())} |
{error, binary()}.
resolve_slos(Organization) ->
Sli_types = begin
_pipe = erlang:element(3, Organization),
_pipe@1 = gleam@list:flat_map(
_pipe,
fun(Service_definition) -> erlang:element(3, Service_definition) end
),
gleam@list:unique(_pipe@1)
end,
_pipe@2 = erlang:element(2, Organization),
_pipe@5 = gleam@list:map(
_pipe@2,
fun(Team) -> _pipe@3 = erlang:element(3, Team),
_pipe@4 = gleam@list:map(
_pipe@3,
fun(Slo) ->
resolve_slo(Slo, erlang:element(2, Team), Sli_types)
end
),
gleam@result:all(_pipe@4) end
),
_pipe@6 = gleam@result:all(_pipe@5),
gleam@result:map(_pipe@6, fun lists:append/1).