Packages
caffeine_lang
4.3.7
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@linker@expectations.erl
-module(caffeine_lang@linker@expectations).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/linker/expectations.gleam").
-export([validate_expectations/3]).
-export_type([expectation/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 expectation() :: {expectation,
binary(),
binary(),
gleam@dict:dict(binary(), caffeine_lang@value:value())}.
-file("src/caffeine_lang/linker/expectations.gleam", 76).
?DOC(
" Validates that every expectation's blueprint_ref matches an existing blueprint.\n"
" Includes Levenshtein-based \"did you mean?\" suggestions for unknown refs.\n"
).
-spec validate_blueprint_refs(
list(expectation()),
list(caffeine_lang@linker@blueprints:blueprint())
) -> {ok, nil} | {error, caffeine_lang@errors:compilation_error()}.
validate_blueprint_refs(Expectations, Blueprints) ->
Blueprint_names = gleam@list:map(
Blueprints,
fun(B) -> erlang:element(2, B) end
),
Missing = begin
_pipe = Expectations,
_pipe@1 = gleam@list:filter(
_pipe,
fun(E) ->
not gleam@list:contains(Blueprint_names, erlang:element(3, E))
end
),
gleam@list:map(_pipe@1, fun(E@1) -> erlang:element(3, E@1) end)
end,
case Missing of
[] ->
{ok, nil};
[Single_ref] ->
Suggestion = caffeine_lang@string_distance:closest_match(
Single_ref,
Blueprint_names
),
{error,
{linker_parse_error,
<<"Unknown blueprint reference: "/utf8, Single_ref/binary>>,
begin
_record = caffeine_lang@errors:empty_context(),
{error_context,
erlang:element(2, _record),
erlang:element(3, _record),
erlang:element(4, _record),
erlang:element(5, _record),
Suggestion}
end}};
_ ->
{error,
{linker_parse_error,
<<"Unknown blueprint reference(s): "/utf8,
(gleam@string:join(Missing, <<", "/utf8>>))/binary>>,
caffeine_lang@errors:empty_context()}}
end.
-file("src/caffeine_lang/linker/expectations.gleam", 107).
-spec check_input_overshadowing(
list({expectation(), caffeine_lang@linker@blueprints:blueprint()}),
binary()
) -> {ok, nil} | {error, caffeine_lang@errors:compilation_error()}.
check_input_overshadowing(Expectations_blueprint_collection, Path_prefix) ->
caffeine_lang@linker@validations:validate_no_overshadowing(
Expectations_blueprint_collection,
fun(Expectation) -> erlang:element(4, Expectation) end,
fun(Blueprint) -> erlang:element(5, Blueprint) end,
fun(Expectation@1) ->
<<<<<<"expectation '"/utf8, Path_prefix/binary>>/binary,
(erlang:element(2, Expectation@1))/binary>>/binary,
"' - overshadowing inputs from blueprint: "/utf8>>
end
).
-file("src/caffeine_lang/linker/expectations.gleam", 23).
?DOC(false).
-spec validate_expectations(
list(expectation()),
list(caffeine_lang@linker@blueprints:blueprint()),
binary()
) -> {ok, list({expectation(), caffeine_lang@linker@blueprints:blueprint()})} |
{error, caffeine_lang@errors:compilation_error()}.
validate_expectations(Expectations, Blueprints, Source_path) ->
gleam@result:'try'(
validate_blueprint_refs(Expectations, Blueprints),
fun(_) ->
Expectations_blueprint_collection = caffeine_lang@helpers:map_reference_to_referrer_over_collection(
Blueprints,
Expectations,
fun(B) -> erlang:element(2, B) end,
fun(E) -> erlang:element(3, E) end
),
{Org, Team, Service} = caffeine_lang@helpers:extract_path_prefix(
Source_path
),
Path_prefix = <<<<<<<<<<Org/binary, "."/utf8>>/binary, Team/binary>>/binary,
"."/utf8>>/binary,
Service/binary>>/binary,
"."/utf8>>,
gleam@result:'try'(
check_input_overshadowing(
Expectations_blueprint_collection,
Path_prefix
),
fun(_) ->
gleam@result:'try'(
caffeine_lang@linker@validations:validate_inputs_for_collection(
Expectations_blueprint_collection,
fun(Expectation) ->
erlang:element(4, Expectation)
end,
fun(Blueprint) ->
Blueprint_input_keys = begin
_pipe = erlang:element(5, Blueprint),
maps:keys(_pipe)
end,
_pipe@1 = erlang:element(4, Blueprint),
gleam@dict:filter(
_pipe@1,
fun(Key, _) ->
not gleam@list:contains(
Blueprint_input_keys,
Key
)
end
)
end,
fun(Expectation@1) ->
<<<<<<"expectation '"/utf8, Path_prefix/binary>>/binary,
(erlang:element(2, Expectation@1))/binary>>/binary,
"'"/utf8>>
end,
false
),
fun(_) ->
gleam@result:'try'(
caffeine_lang@linker@validations:validate_relevant_uniqueness(
Expectations,
fun(E@1) -> erlang:element(2, E@1) end,
<<"expectation names"/utf8>>
),
fun(_) ->
{ok, Expectations_blueprint_collection}
end
)
end
)
end
)
end
).