Current section

Files

Jump to
caffeine_lang src caffeine_lang@phase_2@linker@specification@linker.erl
Raw

src/caffeine_lang@phase_2@linker@specification@linker.erl

-module(caffeine_lang@phase_2@linker@specification@linker).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/phase_2/linker/specification/linker.gleam").
-export([resolve_unresolved_service/2, resolve_unresolved_query_template_type/2, resolve_unresolved_sli_type/3, link_and_validate_specification_sub_parts/4]).
-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/phase_2/linker/specification/linker.gleam", 167).
?DOC(" This function fetches a single SliType by name.\n").
-spec fetch_by_name_sli_type(
list(caffeine_lang@types@ast@sli_type:sli_type()),
binary()
) -> {ok, caffeine_lang@types@ast@sli_type:sli_type()} | {error, binary()}.
fetch_by_name_sli_type(Values, Name) ->
_pipe = gleam@list:find(
Values,
fun(Value) -> erlang:element(2, Value) =:= Name end
),
gleam@result:replace_error(
_pipe,
<<<<"SliType "/utf8, Name/binary>>/binary, " not found"/utf8>>
).
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 142).
?DOC(" This function takes an unresolved Service and a list of SliTypes and returns a resolved Service.\n").
-spec resolve_unresolved_service(
caffeine_lang@types@unresolved@unresolved_service:service(),
list(caffeine_lang@types@ast@sli_type:sli_type())
) -> {ok, caffeine_lang@types@ast@service:service()} | {error, binary()}.
resolve_unresolved_service(Unresolved_service, Sli_types) ->
Resolved_sli_types = begin
_pipe = erlang:element(3, Unresolved_service),
_pipe@1 = gleam@list:map(
_pipe,
fun(Sli_type_name) ->
fetch_by_name_sli_type(Sli_types, Sli_type_name)
end
),
gleam@result:all(_pipe@1)
end,
case Resolved_sli_types of
{ok, Sli_types@1} ->
{ok, {service, erlang:element(2, Unresolved_service), Sli_types@1}};
{error, _} ->
{error, <<"Failed to link sli types to service"/utf8>>}
end.
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 176).
?DOC(" This function fetches a single QueryTemplateType by name.\n").
-spec fetch_by_name_query_template_type(
list(caffeine_lang@types@ast@query_template_type:query_template_type()),
binary()
) -> {ok, caffeine_lang@types@ast@query_template_type:query_template_type()} |
{error, binary()}.
fetch_by_name_query_template_type(Values, Name) ->
_pipe = gleam@list:find(
Values,
fun(Query_template_type) ->
erlang:element(3, Query_template_type) =:= Name
end
),
gleam@result:replace_error(
_pipe,
<<<<"QueryTemplateType "/utf8, Name/binary>>/binary, " not found"/utf8>>
).
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 185).
?DOC(" This function fetches a single BasicType by attribute name.\n").
-spec fetch_by_attribute_name_basic_type(
list(caffeine_lang@types@ast@basic_type:basic_type()),
binary()
) -> {ok, caffeine_lang@types@ast@basic_type:basic_type()} | {error, binary()}.
fetch_by_attribute_name_basic_type(Values, Attribute_name) ->
case gleam@list:find(
Values,
fun(Basic_type) -> erlang:element(2, Basic_type) =:= Attribute_name end
) of
{ok, Basic_type@1} ->
{ok, Basic_type@1};
{error, _} ->
{error,
<<<<"BasicType "/utf8, Attribute_name/binary>>/binary,
" not found"/utf8>>}
end.
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 62).
?DOC(" This function takes an unresolved QueryTemplateType and a list of BasicTypes and returns a resolved QueryTemplateType.\n").
-spec resolve_unresolved_query_template_type(
caffeine_lang@types@unresolved@unresolved_query_template_type:query_template_type(),
list(caffeine_lang@types@ast@basic_type:basic_type())
) -> {ok, caffeine_lang@types@ast@query_template_type:query_template_type()} |
{error, binary()}.
resolve_unresolved_query_template_type(
Unresolved_query_template_type,
Basic_types
) ->
case Unresolved_query_template_type of
{query_template_type, Name, Metric_attribute_names, Query} ->
Filters = begin
_pipe = Metric_attribute_names,
_pipe@1 = gleam@list:map(
_pipe,
fun(Attribute_name) ->
fetch_by_attribute_name_basic_type(
Basic_types,
Attribute_name
)
end
),
_pipe@2 = gleam@result:all(_pipe@1),
gleam@result:unwrap(_pipe@2, [])
end,
{ok, {query_template_type, Filters, Name, Query}}
end.
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 91).
?DOC(" This function takes an unresolved SliType, a list of QueryTemplateTypes, and a list of BasicTypes and returns a resolved SliType.\n").
-spec resolve_unresolved_sli_type(
caffeine_lang@types@unresolved@unresolved_sli_type:sli_type(),
list(caffeine_lang@types@ast@query_template_type:query_template_type()),
list(caffeine_lang@types@ast@basic_type:basic_type())
) -> {ok, caffeine_lang@types@ast@sli_type:sli_type()} | {error, binary()}.
resolve_unresolved_sli_type(
Unresolved_sli_type,
Query_template_types,
Basic_types
) ->
gleam@result:'try'(
fetch_by_name_query_template_type(
Query_template_types,
erlang:element(3, Unresolved_sli_type)
),
fun(Query_template_type) ->
Specification_of_query_templatized_variables = begin
_pipe = erlang:element(5, Unresolved_sli_type),
_pipe@1 = gleam@list:map(
_pipe,
fun(Attribute_name) ->
fetch_by_attribute_name_basic_type(
Basic_types,
Attribute_name
)
end
),
_pipe@2 = gleam@result:all(_pipe@1),
gleam@result:unwrap(_pipe@2, [])
end,
Type_defs = begin
_pipe@3 = erlang:element(2, Query_template_type),
gleam@list:fold(
_pipe@3,
maps:new(),
fun(Acc, Filter) ->
gleam@dict:insert(
Acc,
erlang:element(2, Filter),
erlang:element(3, Filter)
)
end
)
end,
Default_type = string,
Typed_instatiation_of_query_templates = begin
_pipe@4 = erlang:element(4, Unresolved_sli_type),
gleam@dict:map_values(_pipe@4, fun(_, _) -> Default_type end)
end,
Merged_type_defs = maps:merge(
Typed_instatiation_of_query_templates,
Type_defs
),
gleam@result:'try'(
caffeine_lang@types@common@generic_dictionary:from_string_dict(
erlang:element(4, Unresolved_sli_type),
Merged_type_defs
),
fun(Metric_attributes) ->
{ok,
{sli_type,
erlang:element(2, Unresolved_sli_type),
Query_template_type,
Metric_attributes,
Specification_of_query_templatized_variables}}
end
)
end
).
-file("src/caffeine_lang/phase_2/linker/specification/linker.gleam", 19).
?DOC(
" This function is a three step process. While it fundamentally enables us to resolve\n"
" the specification (services), it also semantically validates that the specification\n"
" makes sense; right now this just means that we're able to link query_template_types to sli_types,\n"
" query_template_filters to query_template_types, and sli_types to services.\n"
).
-spec link_and_validate_specification_sub_parts(
list(caffeine_lang@types@unresolved@unresolved_service:service()),
list(caffeine_lang@types@unresolved@unresolved_sli_type:sli_type()),
list(caffeine_lang@types@ast@basic_type:basic_type()),
list(caffeine_lang@types@unresolved@unresolved_query_template_type:query_template_type())
) -> {ok, list(caffeine_lang@types@ast@service:service())} | {error, binary()}.
link_and_validate_specification_sub_parts(
Services,
Unresolved_sli_types,
Basic_types,
Query_template_types_unresolved
) ->
gleam@result:'try'(
begin
_pipe = Query_template_types_unresolved,
_pipe@1 = gleam@list:map(
_pipe,
fun(Query_template_type) ->
resolve_unresolved_query_template_type(
Query_template_type,
Basic_types
)
end
),
gleam@result:all(_pipe@1)
end,
fun(Resolved_query_template_types) ->
gleam@result:'try'(
begin
_pipe@2 = Unresolved_sli_types,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Sli_type) ->
resolve_unresolved_sli_type(
Sli_type,
Resolved_query_template_types,
Basic_types
)
end
),
gleam@result:all(_pipe@3)
end,
fun(Resolved_sli_types) ->
gleam@result:'try'(
begin
_pipe@4 = Services,
_pipe@5 = gleam@list:map(
_pipe@4,
fun(Service) ->
resolve_unresolved_service(
Service,
Resolved_sli_types
)
end
),
gleam@result:all(_pipe@5)
end,
fun(Resolved_services) -> {ok, Resolved_services} end
)
end
)
end
).