Packages
caffeine_lang
0.0.16
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_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
).