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([parse_standard_library/0, parse_from_json_file/1]).
-export_type([artifact/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(),
gleam@dict:dict(binary(), caffeine_lang@common@accepted_types:accepted_types())}.
-file("src/caffeine_lang/parser/artifacts.gleam", 51).
-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(
<<"name"/utf8>>,
caffeine_lang@common@decoders:non_empty_string_decoder(),
fun(Name) ->
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, Name, 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", 34).
?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) -> erlang:element(2, A) end,
<<"artifact names"/utf8>>
),
fun(_) -> {ok, Artifacts@1} end
)
end).
-file("src/caffeine_lang/parser/artifacts.gleam", 19).
?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\": [
{
\"name\": \"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 } }\" }
},
{
\"name\": \"DependencyRelation\",
\"params\": { \"relation\": \"String { x | x in { soft, hard } }\", \"dependent\": \"String\" }
}
]
}
"/utf8>>
).
-file("src/caffeine_lang/parser/artifacts.gleam", 25).
?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
).