Packages
caffeine_lang
2.0.2
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@parser@expectations.erl
-module(caffeine_lang@parser@expectations).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/parser/expectations.gleam").
-export([expectations_from_json/2, parse_from_json_string/2, parse_from_json_file/2]).
-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(), gleam@dynamic:dynamic_())}.
-file("src/caffeine_lang/parser/expectations.gleam", 53).
?DOC(false).
-spec expectations_from_json(
binary(),
list(caffeine_lang@parser@blueprints:blueprint())
) -> {ok, list(expectation())} | {error, gleam@json:decode_error()}.
expectations_from_json(Json_string, Blueprints) ->
Expectation_decoded = begin
gleam@dynamic@decode:field(
<<"name"/utf8>>,
caffeine_lang@common@decoders:non_empty_string_decoder(),
fun(Name) ->
gleam@dynamic@decode:field(
<<"blueprint_ref"/utf8>>,
caffeine_lang@common@decoders:named_reference_decoder(
Blueprints,
fun(B) -> erlang:element(2, B) end
),
fun(Blueprint_ref) ->
gleam@dynamic@decode:field(
<<"inputs"/utf8>>,
gleam@dynamic@decode:dict(
{decoder,
fun gleam@dynamic@decode:decode_string/1},
{decoder,
fun gleam@dynamic@decode:decode_dynamic/1}
),
fun(Inputs) ->
gleam@dynamic@decode:success(
{expectation, Name, Blueprint_ref, Inputs}
)
end
)
end
)
end
)
end,
Expectations_decoded = begin
gleam@dynamic@decode:field(
<<"expectations"/utf8>>,
gleam@dynamic@decode:list(Expectation_decoded),
fun(Expectations) -> gleam@dynamic@decode:success(Expectations) end
)
end,
gleam@json:parse(Json_string, Expectations_decoded).
-file("src/caffeine_lang/parser/expectations.gleam", 124).
-spec check_input_overshadowing(
list({expectation(), caffeine_lang@parser@blueprints:blueprint()})
) -> {ok, boolean()} | {error, caffeine_lang@common@errors:compilation_error()}.
check_input_overshadowing(Expectations_blueprint_collection) ->
Overshadow_errors = begin
_pipe = Expectations_blueprint_collection,
_pipe@1 = gleam@list:filter_map(
_pipe,
fun(Pair) ->
{Expectation, Blueprint} = Pair,
case caffeine_lang@common@validations:check_collection_key_overshadowing(
erlang:element(4, Expectation),
erlang:element(5, Blueprint),
<<<<"Expectation '"/utf8,
(erlang:element(2, Expectation))/binary>>/binary,
"' overshadowing inputs from blueprint: "/utf8>>
) of
{ok, _} ->
{error, nil};
{error, Msg} ->
{ok, Msg}
end
end
),
gleam@string:join(_pipe@1, <<", "/utf8>>)
end,
case Overshadow_errors of
<<""/utf8>> ->
{ok, true};
_ ->
{error, {parser_duplicate_error, Overshadow_errors}}
end.
-file("src/caffeine_lang/parser/expectations.gleam", 83).
?DOC(
" Validate expectations and return paired with their blueprints.\n"
" TODO: This provides massive duplication and is an area of low hanging fruit for optimization.\n"
).
-spec validate_expectations(
list(expectation()),
list(caffeine_lang@parser@blueprints:blueprint())
) -> {ok, list({expectation(), caffeine_lang@parser@blueprints:blueprint()})} |
{error, caffeine_lang@common@errors:compilation_error()}.
validate_expectations(Expectations, Blueprints) ->
Expectations_blueprint_collection = caffeine_lang@common@helpers:map_reference_to_referrer_over_collection(
Blueprints,
Expectations,
fun(B) -> erlang:element(2, B) end,
fun(E) -> erlang:element(3, E) end
),
gleam@result:'try'(
check_input_overshadowing(Expectations_blueprint_collection),
fun(_) ->
gleam@result:'try'(
caffeine_lang@common@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,
false
),
fun(_) ->
gleam@result:'try'(
caffeine_lang@common@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
).
-file("src/caffeine_lang/parser/expectations.gleam", 36).
?DOC(false).
-spec parse_from_json_string(
binary(),
list(caffeine_lang@parser@blueprints:blueprint())
) -> {ok, list({expectation(), caffeine_lang@parser@blueprints:blueprint()})} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_from_json_string(Json_string, Blueprints) ->
gleam@result:'try'(case expectations_from_json(Json_string, Blueprints) of
{ok, Expectations} ->
{ok, Expectations};
{error, Err} ->
{error,
caffeine_lang@common@errors:format_json_decode_error(Err)}
end, fun(Expectations@1) ->
validate_expectations(Expectations@1, Blueprints)
end).
-file("src/caffeine_lang/parser/expectations.gleam", 25).
?DOC(false).
-spec parse_from_json_file(
binary(),
list(caffeine_lang@parser@blueprints:blueprint())
) -> {ok, list({expectation(), caffeine_lang@parser@blueprints:blueprint()})} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_from_json_file(File_path, Blueprints) ->
gleam@result:'try'(
caffeine_lang@common@helpers:json_from_file(File_path),
fun(Json_string) -> parse_from_json_string(Json_string, Blueprints) end
).