Current section

Files

Jump to
caffeine_lang src caffeine_lang@phase_4@slo_resolver.erl
Raw

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([convert_list_to_or_expression/1, parse_list_value/2, inner_parse_string/1, inner_parse_int/1, resolve_sli/2, resolve_slo/3, resolve_slos/1]).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 199).
-spec convert_list_to_or_expression(list(binary())) -> binary().
convert_list_to_or_expression(Items) ->
case Items of
[] ->
<<""/utf8>>;
[Single] ->
Single;
Multiple ->
<<<<"("/utf8, (gleam@string:join(Multiple, <<","/utf8>>))/binary>>/binary,
")"/utf8>>
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 207).
-spec parse_list_value(
binary(),
fun((binary()) -> {ok, PQF} | {error, binary()})
) -> {ok, list(PQF)} | {error, binary()}.
parse_list_value(Value, Inner_parse) ->
Splitted = gleam@string:split(Value, <<"]"/utf8>>),
Splitted@1 = gleam@string:split(
gleam@string:join(Splitted, <<""/utf8>>),
<<"["/utf8>>
),
Result = begin
_pipe = gleam@string:join(Splitted@1, <<""/utf8>>),
_pipe@1 = gleam@string:split(_pipe, <<","/utf8>>),
_pipe@2 = gleam@list:map(_pipe@1, Inner_parse),
gleam@result:all(_pipe@2)
end,
Result.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 223).
-spec inner_parse_string(binary()) -> {ok, binary()} | {error, binary()}.
inner_parse_string(Value) ->
Splitted = gleam@string:split(Value, <<"\""/utf8>>),
Result = begin
_pipe = gleam@string:join(Splitted, <<""/utf8>>),
gleam@string:trim(_pipe)
end,
{ok, Result}.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 232).
-spec inner_parse_int(binary()) -> {ok, integer()} | {error, binary()}.
inner_parse_int(Value) ->
case gleam_stdlib:parse_int(gleam@string:trim(Value)) of
{ok, Int_value} ->
{ok, Int_value};
{error, _} ->
{error, <<"Invalid integer value: "/utf8, Value/binary>>}
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 239).
-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", 170).
-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, Inner_type}} ->
case Inner_type of
string ->
case parse_list_value(Value, fun inner_parse_string/1) of
{ok, Parsed_list} ->
convert_list_to_or_expression(Parsed_list);
{error, _} ->
Value
end;
integer ->
case parse_list_value(Value, fun inner_parse_int/1) of
{ok, Parsed_list@1} ->
convert_list_to_or_expression(
gleam@list:map(
Parsed_list@1,
fun erlang:integer_to_binary/1
)
);
{error, _} ->
Value
end;
_ ->
Value
end;
_ ->
Value
end.
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 132).
-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", 112).
-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", 100).
-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", 61).
-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(2, Sli_type),
erlang:element(3, Sli_type),
Resolved_queries,
Resolved_query}}
end
).
-file("src/caffeine_lang/phase_4/slo_resolver.gleam", 35).
-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 => 40,
value => _assert_fail,
start => 1064,
'end' => 1168,
pattern_start => 1075,
pattern_end => 1087})
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", 15).
-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).