Current section

Files

Jump to
caffeine_lang src caffeine_lang@middle_end@semantic_analyzer.erl
Raw

src/caffeine_lang@middle_end@semantic_analyzer.erl

-module(caffeine_lang@middle_end@semantic_analyzer).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/middle_end/semantic_analyzer.gleam").
-export([resolve_vendor/1, resolve_queries/1, resolve_intermediate_representations/1]).
-export_type([intermediate_representation/0, intermediate_representation_meta_data/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type intermediate_representation() :: {intermediate_representation,
intermediate_representation_meta_data(),
binary(),
binary(),
list(caffeine_lang@common@helpers:value_tuple()),
gleam@option:option(caffeine_lang@middle_end@vendor:vendor())}.
-type intermediate_representation_meta_data() :: {intermediate_representation_meta_data,
binary(),
binary(),
binary(),
binary(),
binary(),
gleam@dict:dict(binary(), binary())}.
-file("src/caffeine_lang/middle_end/semantic_analyzer.gleam", 54).
?DOC(false).
-spec resolve_vendor(intermediate_representation()) -> {ok,
intermediate_representation()} |
{error, caffeine_lang@common@errors:compilation_error()}.
resolve_vendor(Ir) ->
case begin
_pipe = erlang:element(5, Ir),
_pipe@1 = gleam@list:filter(
_pipe,
fun(Value) -> erlang:element(2, Value) =:= <<"vendor"/utf8>> end
),
gleam@list:first(_pipe@1)
end of
{error, _} ->
{error,
{semantic_analysis_vendor_resolution_error,
<<"No vendor input for: "/utf8,
(erlang:element(3, Ir))/binary>>}};
{ok, Vendor_value_tuple} ->
Vendor_string@1 = case gleam@dynamic@decode:run(
erlang:element(4, Vendor_value_tuple),
{decoder, fun gleam@dynamic@decode:decode_string/1}
) of
{ok, Vendor_string} -> Vendor_string;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"caffeine_lang/middle_end/semantic_analyzer"/utf8>>,
function => <<"resolve_vendor"/utf8>>,
line => 68,
value => _assert_fail,
start => 2201,
'end' => 2291,
pattern_start => 2212,
pattern_end => 2229})
end,
Vendor_value = caffeine_lang@middle_end@vendor:resolve_vendor(
Vendor_string@1
),
{ok,
{intermediate_representation,
erlang:element(2, Ir),
erlang:element(3, Ir),
erlang:element(4, Ir),
erlang:element(5, Ir),
{some, Vendor_value}}}
end.
-file("src/caffeine_lang/middle_end/semantic_analyzer.gleam", 79).
?DOC(false).
-spec resolve_queries(intermediate_representation()) -> {ok,
intermediate_representation()} |
{error, caffeine_lang@common@errors:compilation_error()}.
resolve_queries(Ir) ->
case erlang:element(6, Ir) of
{some, datadog} ->
Queries_value_tuple@1 = case begin
_pipe = erlang:element(5, Ir),
_pipe@1 = gleam@list:filter(
_pipe,
fun(Vt) -> erlang:element(2, Vt) =:= <<"queries"/utf8>> end
),
gleam@list:first(_pipe@1)
end of
{ok, Queries_value_tuple} -> Queries_value_tuple;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"caffeine_lang/middle_end/semantic_analyzer"/utf8>>,
function => <<"resolve_queries"/utf8>>,
line => 84,
value => _assert_fail,
start => 2700,
'end' => 2833,
pattern_start => 2711,
pattern_end => 2734})
end,
Queries_dict@1 = case gleam@dynamic@decode:run(
erlang:element(4, Queries_value_tuple@1),
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
{decoder, fun gleam@dynamic@decode:decode_string/1}
)
) of
{ok, Queries_dict} -> Queries_dict;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"caffeine_lang/middle_end/semantic_analyzer"/utf8>>,
function => <<"resolve_queries"/utf8>>,
line => 89,
value => _assert_fail@1,
start => 2841,
'end' => 2990,
pattern_start => 2852,
pattern_end => 2868})
end,
gleam@result:'try'(
begin
_pipe@2 = Queries_dict@1,
_pipe@3 = maps:to_list(_pipe@2),
gleam@list:try_map(
_pipe@3,
fun(Pair) ->
{Key, Query} = Pair,
gleam@result:map(
caffeine_lang@middle_end@templatizer:parse_and_resolve_query_template(
Query,
erlang:element(5, Ir)
),
fun(Resolved) -> {Key, Resolved} end
)
end
)
end,
fun(Resolved_queries) ->
Resolved_queries_dynamic = begin
_pipe@4 = Resolved_queries,
_pipe@5 = gleam@list:map(
_pipe@4,
fun(Pair@1) ->
{Key@1, Value} = Pair@1,
{gleam_stdlib:identity(Key@1),
gleam_stdlib:identity(Value)}
end
),
gleam@dynamic:properties(_pipe@5)
end,
New_queries_value_tuple = {value_tuple,
<<"queries"/utf8>>,
{collection_type,
{dict,
{primitive_type, string},
{primitive_type, string}}},
Resolved_queries_dynamic},
Value_tuple_result = begin
_pipe@6 = erlang:element(5, Ir),
_pipe@7 = gleam@list:filter(
_pipe@6,
fun(Vt@1) ->
erlang:element(2, Vt@1) =:= <<"value"/utf8>>
end
),
gleam@list:first(_pipe@7)
end,
gleam@result:'try'(case Value_tuple_result of
{error, _} ->
{ok, none};
{ok, Value_tuple} ->
Value_string@1 = case gleam@dynamic@decode:run(
erlang:element(4, Value_tuple),
{decoder,
fun gleam@dynamic@decode:decode_string/1}
) of
{ok, Value_string} -> Value_string;
_assert_fail@2 ->
erlang:error(
#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"caffeine_lang/middle_end/semantic_analyzer"/utf8>>,
function => <<"resolve_queries"/utf8>>,
line => 134,
value => _assert_fail@2,
start => 4341,
'end' => 4427,
pattern_start => 4352,
pattern_end => 4368}
)
end,
case caffeine_lang@middle_end@templatizer:parse_and_resolve_query_template(
Value_string@1,
erlang:element(5, Ir)
) of
{ok, Resolved_value} ->
{ok,
{some,
{value_tuple,
<<"value"/utf8>>,
{primitive_type, string},
gleam_stdlib:identity(
Resolved_value
)}}};
{error, Err} ->
{error, Err}
end
end, fun(Resolved_value_tuple) ->
New_values = begin
_pipe@8 = erlang:element(5, Ir),
gleam@list:map(
_pipe@8,
fun(Vt@2) -> case erlang:element(2, Vt@2) of
<<"queries"/utf8>> ->
New_queries_value_tuple;
<<"value"/utf8>> ->
case Resolved_value_tuple of
{some, New_value} ->
New_value;
none ->
Vt@2
end;
_ ->
Vt@2
end end
)
end,
{ok,
{intermediate_representation,
erlang:element(2, Ir),
erlang:element(3, Ir),
erlang:element(4, Ir),
New_values,
erlang:element(6, Ir)}}
end)
end
);
_ ->
{error,
{semantic_analysis_template_resolution_error,
<<"No vendor for expectation: "/utf8,
(erlang:element(3, Ir))/binary>>}}
end.
-file("src/caffeine_lang/middle_end/semantic_analyzer.gleam", 42).
?DOC(false).
-spec resolve_intermediate_representations(list(intermediate_representation())) -> {ok,
list(intermediate_representation())} |
{error, caffeine_lang@common@errors:compilation_error()}.
resolve_intermediate_representations(Irs) ->
_pipe = Irs,
gleam@list:try_map(
_pipe,
fun(Ir) ->
gleam@result:'try'(
resolve_vendor(Ir),
fun(Ir_with_vendor) -> resolve_queries(Ir_with_vendor) end
)
end
).