Packages
caffeine_lang
1.0.1
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@artifacts.erl
-module(caffeine_lang@parser@artifacts).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/caffeine_lang/parser/artifacts.gleam").
-export([parse_semver/1, parse_standard_library/0, parse_from_file/1]).
-export_type([artifact/0, semver/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 artifact() :: {artifact,
binary(),
semver(),
gleam@dict:dict(binary(), caffeine_lang@common@helpers:accepted_types()),
gleam@dict:dict(binary(), caffeine_lang@common@helpers:accepted_types())}.
-type semver() :: {semver, integer(), integer(), integer()}.
-file("src/caffeine_lang/parser/artifacts.gleam", 75).
?DOC(
" Parse a single semver part - must be non-negative and no leading zeros\n"
" (except for \"0\" itself).\n"
).
-spec parse_semver_part(binary()) -> {ok, integer()} | {error, nil}.
parse_semver_part(S) ->
case S of
<<""/utf8>> ->
{error, nil};
<<"0"/utf8>> ->
{ok, 0};
_ ->
case gleam_stdlib:string_starts_with(S, <<"0"/utf8>>) orelse gleam_stdlib:string_starts_with(
S,
<<"-"/utf8>>
) of
true ->
{error, nil};
false ->
gleam_stdlib:parse_int(S)
end
end.
-file("src/caffeine_lang/parser/artifacts.gleam", 64).
?DOC(false).
-spec parse_semver(binary()) -> {ok, semver()} | {error, nil}.
parse_semver(Version_string) ->
case begin
_pipe = Version_string,
_pipe@1 = gleam@string:split(_pipe, <<"."/utf8>>),
gleam@list:map(_pipe@1, fun parse_semver_part/1)
end of
[{ok, Major}, {ok, Minor}, {ok, Patch}] ->
{ok, {semver, Major, Minor, Patch}};
_ ->
{error, nil}
end.
-file("src/caffeine_lang/parser/artifacts.gleam", 88).
?DOC(" Decoder for semantic version strings (e.g., \"1.2.3\").\n").
-spec semantic_version_decoder() -> gleam@dynamic@decode:decoder(semver()).
semantic_version_decoder() ->
Err_default = {semver, 0, 0, 0},
gleam@dynamic@decode:new_primitive_decoder(
<<"Semver"/utf8>>,
fun(Dyn) ->
gleam@result:'try'(
begin
_pipe = gleam@dynamic@decode:run(
Dyn,
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
gleam@result:replace_error(_pipe, Err_default)
end,
fun(Str) -> _pipe@1 = parse_semver(Str),
gleam@result:replace_error(_pipe@1, Err_default) end
)
end
).
-file("src/caffeine_lang/parser/artifacts.gleam", 98).
-spec parse_from_string(binary()) -> {ok, list(artifact())} |
{error, gleam@json:decode_error()}.
parse_from_string(Json_string) ->
Artifact_decoder = begin
gleam@dynamic@decode:field(
<<"name"/utf8>>,
caffeine_lang@common@decoders:non_empty_string_decoder(),
fun(Name) ->
gleam@dynamic@decode:field(
<<"version"/utf8>>,
semantic_version_decoder(),
fun(Version) ->
gleam@dynamic@decode:field(
<<"inherited_params"/utf8>>,
gleam@dynamic@decode:dict(
{decoder,
fun gleam@dynamic@decode:decode_string/1},
caffeine_lang@common@decoders:accepted_types_decoder(
)
),
fun(Inherited_params) ->
gleam@dynamic@decode:field(
<<"required_params"/utf8>>,
gleam@dynamic@decode:dict(
{decoder,
fun gleam@dynamic@decode:decode_string/1},
caffeine_lang@common@decoders:accepted_types_decoder(
)
),
fun(Required_params) ->
gleam@dynamic@decode:success(
{artifact,
Name,
Version,
Inherited_params,
Required_params}
)
end
)
end
)
end
)
end
)
end,
Artifacts_decoded = begin
gleam@dynamic@decode:field(
<<"artifacts"/utf8>>,
gleam@dynamic@decode:list(Artifact_decoder),
fun(Artifacts) -> gleam@dynamic@decode:success(Artifacts) end
)
end,
gleam@json:parse(Json_string, Artifacts_decoded).
-file("src/caffeine_lang/parser/artifacts.gleam", 44).
?DOC(" The actual, common parsing logic.\n").
-spec internal_parse_from_string(binary()) -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
internal_parse_from_string(Content) ->
gleam@result:'try'(case parse_from_string(Content) of
{ok, Artifacts} ->
{ok, Artifacts};
{error, Err} ->
{error,
caffeine_lang@common@errors:format_json_decode_error(Err)}
end, fun(Artifacts@1) ->
gleam@result:'try'(
caffeine_lang@common@validations:validate_relevant_uniqueness(
Artifacts@1,
fun(A) -> erlang:element(2, A) end,
<<"artifact names"/utf8>>
),
fun(_) -> {ok, Artifacts@1} end
)
end).
-file("src/caffeine_lang/parser/artifacts.gleam", 32).
?DOC(" Parses the embedded standard library artifacts.\n").
-spec parse_standard_library() -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_standard_library() ->
internal_parse_from_string(
<<"
{
\"artifacts\": [
{
\"name\": \"SLO\",
\"version\": \"0.0.1\",
\"inherited_params\": { \"threshold\": \"Float\", \"window_in_days\": \"Integer\" },
\"required_params\": { \"queries\": \"Dict(String, String)\", \"value\": \"String\", \"vendor\": \"String\"}
}
]
}
"/utf8>>
).
-file("src/caffeine_lang/parser/artifacts.gleam", 37).
?DOC(" Parses an artifact from an artifacts.json file.\n").
-spec parse_from_file(binary()) -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_from_file(File_path) ->
gleam@result:'try'(
caffeine_lang@common@helpers:json_from_file(File_path),
fun(Json_string) -> internal_parse_from_string(Json_string) end
).