-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\": { \"relation\": \"Dict(String { x | x in { soft, hard } }, List(String))\", \"dependent\": \"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 ).