Current section

Files

Jump to
caffeine_lang src caffeine_lang@parser@artifacts.erl
Raw

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([artifact_type_to_string/1, parse_standard_library/0, parse_from_json_file/1]).
-export_type([artifact/0, artifact_type/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,
artifact_type(),
gleam@dict:dict(binary(), caffeine_lang@common@accepted_types:accepted_types())}.
-type artifact_type() :: s_l_o | dependency_relations.
-file("src/caffeine_lang/parser/artifacts.gleam", 41).
?DOC(false).
-spec artifact_type_to_string(artifact_type()) -> binary().
artifact_type_to_string(Type_) ->
case Type_ of
s_l_o ->
<<"SLO"/utf8>>;
dependency_relations ->
<<"DependencyRelations"/utf8>>
end.
-file("src/caffeine_lang/parser/artifacts.gleam", 49).
?DOC(" Decoder for ArtifactType from a string.\n").
-spec artifact_type_decoder() -> gleam@dynamic@decode:decoder(artifact_type()).
artifact_type_decoder() ->
gleam@dynamic@decode:then(
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Type_string) -> case Type_string of
<<"SLO"/utf8>> ->
gleam@dynamic@decode:success(s_l_o);
<<"DependencyRelations"/utf8>> ->
gleam@dynamic@decode:success(dependency_relations);
_ ->
gleam@dynamic@decode:failure(
s_l_o,
<<"SLO or DependencyRelations"/utf8>>
)
end end
).
-file("src/caffeine_lang/parser/artifacts.gleam", 76).
-spec parse_from_json_string(binary()) -> {ok, list(artifact())} |
{error, gleam@json:decode_error()}.
parse_from_json_string(Json_string) ->
Artifact_decoder = begin
gleam@dynamic@decode:field(
<<"type_"/utf8>>,
artifact_type_decoder(),
fun(Type_) ->
gleam@dynamic@decode:field(
<<"params"/utf8>>,
gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
caffeine_lang@common@decoders:accepted_types_decoder()
),
fun(Params) ->
gleam@dynamic@decode:success({artifact, Type_, Params})
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", 59).
?DOC(" The actual, common parsing logic.\n").
-spec internal_parse_from_json_string(binary()) -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
internal_parse_from_json_string(Content) ->
gleam@result:'try'(case parse_from_json_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) -> _pipe = erlang:element(2, A),
artifact_type_to_string(_pipe) end,
<<"artifact names"/utf8>>
),
fun(_) -> {ok, Artifacts@1} end
)
end).
-file("src/caffeine_lang/parser/artifacts.gleam", 25).
?DOC(false).
-spec parse_standard_library() -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_standard_library() ->
internal_parse_from_json_string(
<<"
{
\"artifacts\": [
{
\"type_\": \"SLO\",
\"params\": { \"threshold\": \"Float { x | x in ( 0.0..100.0 ) }\", \"window_in_days\": \"Defaulted(Integer, 30) { x | x in { 7, 30, 90 } }\", \"queries\": \"Dict(String, String)\", \"value\": \"String\", \"vendor\": \"String { x | x in { datadog } }\" }
},
{
\"type_\": \"DependencyRelations\",
\"params\": { \"relations\": \"Dict(String { x | x in { soft, hard } }, List(String))\" }
}
]
}
"/utf8>>
).
-file("src/caffeine_lang/parser/artifacts.gleam", 31).
?DOC(false).
-spec parse_from_json_file(binary()) -> {ok, list(artifact())} |
{error, caffeine_lang@common@errors:compilation_error()}.
parse_from_json_file(File_path) ->
gleam@result:'try'(
caffeine_lang@common@helpers:json_from_file(File_path),
fun(Json_string) -> internal_parse_from_json_string(Json_string) end
).