-module(caffeine_lang@errors). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/caffeine_lang/errors.gleam"). -export([empty_context/0, frontend_parse_error/1, frontend_validation_error/1, linker_value_validation_error/1, linker_duplicate_error/1, linker_parse_error/1, linker_vendor_resolution_error/1, semantic_analysis_template_parse_error/1, semantic_analysis_template_resolution_error/1, semantic_analysis_dependency_validation_error/1, generator_slo_query_resolution_error/1, generator_terraform_resolution_error/2, cql_resolver_error/1, cql_parser_error/1, error_code_to_string/1, error_code_for/1, error_context/1, prefix_error/2, to_list/1, to_message/1, from_results/1, format_validation_error_message/3]). -export_type([error_context/0, source_location/0, compilation_error/0, error_code/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 error_context() :: {error_context, gleam@option:option(binary()), gleam@option:option(binary()), gleam@option:option(binary()), gleam@option:option(source_location()), gleam@option:option(binary())}. -type source_location() :: {source_location, integer(), integer(), gleam@option:option(integer())}. -type compilation_error() :: {frontend_parse_error, binary(), error_context()} | {frontend_validation_error, binary(), error_context()} | {linker_value_validation_error, binary(), error_context()} | {linker_duplicate_error, binary(), error_context()} | {linker_parse_error, binary(), error_context()} | {linker_vendor_resolution_error, binary(), error_context()} | {semantic_analysis_template_parse_error, binary(), error_context()} | {semantic_analysis_template_resolution_error, binary(), error_context()} | {semantic_analysis_dependency_validation_error, binary(), error_context()} | {generator_slo_query_resolution_error, binary(), error_context()} | {generator_terraform_resolution_error, binary(), binary(), error_context()} | {c_q_l_resolver_error, binary(), error_context()} | {c_q_l_parser_error, binary(), error_context()} | {compilation_errors, list(compilation_error())}. -type error_code() :: {error_code, binary(), integer()}. -file("src/caffeine_lang/errors.gleam", 26). ?DOC(" Returns an ErrorContext with all fields set to None.\n"). -spec empty_context() -> error_context(). empty_context() -> {error_context, none, none, none, none, none}. -file("src/caffeine_lang/errors.gleam", 70). ?DOC(false). -spec frontend_parse_error(binary()) -> compilation_error(). frontend_parse_error(Msg) -> {frontend_parse_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 76). ?DOC(false). -spec frontend_validation_error(binary()) -> compilation_error(). frontend_validation_error(Msg) -> {frontend_validation_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 82). ?DOC(false). -spec linker_value_validation_error(binary()) -> compilation_error(). linker_value_validation_error(Msg) -> {linker_value_validation_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 88). ?DOC(false). -spec linker_duplicate_error(binary()) -> compilation_error(). linker_duplicate_error(Msg) -> {linker_duplicate_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 94). ?DOC(false). -spec linker_parse_error(binary()) -> compilation_error(). linker_parse_error(Msg) -> {linker_parse_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 100). ?DOC(false). -spec linker_vendor_resolution_error(binary()) -> compilation_error(). linker_vendor_resolution_error(Msg) -> {linker_vendor_resolution_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 106). ?DOC(false). -spec semantic_analysis_template_parse_error(binary()) -> compilation_error(). semantic_analysis_template_parse_error(Msg) -> {semantic_analysis_template_parse_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 114). ?DOC(false). -spec semantic_analysis_template_resolution_error(binary()) -> compilation_error(). semantic_analysis_template_resolution_error(Msg) -> {semantic_analysis_template_resolution_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 122). ?DOC(false). -spec semantic_analysis_dependency_validation_error(binary()) -> compilation_error(). semantic_analysis_dependency_validation_error(Msg) -> {semantic_analysis_dependency_validation_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 130). ?DOC(false). -spec generator_slo_query_resolution_error(binary()) -> compilation_error(). generator_slo_query_resolution_error(Msg) -> {generator_slo_query_resolution_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 138). ?DOC(false). -spec generator_terraform_resolution_error(binary(), binary()) -> compilation_error(). generator_terraform_resolution_error(Vendor, Msg) -> {generator_terraform_resolution_error, Vendor, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 147). ?DOC(false). -spec cql_resolver_error(binary()) -> compilation_error(). cql_resolver_error(Msg) -> {c_q_l_resolver_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 153). ?DOC(false). -spec cql_parser_error(binary()) -> compilation_error(). cql_parser_error(Msg) -> {c_q_l_parser_error, Msg, empty_context()}. -file("src/caffeine_lang/errors.gleam", 166). ?DOC(false). -spec error_code_to_string(error_code()) -> binary(). error_code_to_string(Code) -> S = erlang:integer_to_binary(erlang:element(3, Code)), Padding = 3 - string:length(S), case Padding > 0 of true -> <<<<"E"/utf8, (gleam@string:repeat(<<"0"/utf8>>, Padding))/binary>>/binary, S/binary>>; false -> <<"E"/utf8, S/binary>> end. -file("src/caffeine_lang/errors.gleam", 198). ?DOC( " Maps a vendor string to its codegen error code.\n" " New vendors should be assigned a unique number in the 5xx range.\n" ). -spec vendor_to_error_code(binary()) -> error_code(). vendor_to_error_code(Vendor) -> case Vendor of V when V =:= <<"datadog"/utf8>> -> {error_code, <<"codegen"/utf8>>, 502}; _ -> {error_code, <<"codegen"/utf8>>, 500} end. -file("src/caffeine_lang/errors.gleam", 176). ?DOC(" Assigns an error code based on the CompilationError variant.\n"). -spec error_code_for(compilation_error()) -> error_code(). error_code_for(Error) -> case Error of {frontend_parse_error, _, _} -> {error_code, <<"parse"/utf8>>, 100}; {frontend_validation_error, _, _} -> {error_code, <<"validation"/utf8>>, 200}; {linker_value_validation_error, _, _} -> {error_code, <<"linker"/utf8>>, 302}; {linker_duplicate_error, _, _} -> {error_code, <<"linker"/utf8>>, 303}; {linker_parse_error, _, _} -> {error_code, <<"linker"/utf8>>, 301}; {linker_vendor_resolution_error, _, _} -> {error_code, <<"linker"/utf8>>, 304}; {semantic_analysis_template_parse_error, _, _} -> {error_code, <<"semantic"/utf8>>, 402}; {semantic_analysis_template_resolution_error, _, _} -> {error_code, <<"semantic"/utf8>>, 403}; {semantic_analysis_dependency_validation_error, _, _} -> {error_code, <<"semantic"/utf8>>, 404}; {generator_slo_query_resolution_error, _, _} -> {error_code, <<"codegen"/utf8>>, 501}; {generator_terraform_resolution_error, Vendor, _, _} -> vendor_to_error_code(Vendor); {c_q_l_resolver_error, _, _} -> {error_code, <<"cql"/utf8>>, 601}; {c_q_l_parser_error, _, _} -> {error_code, <<"cql"/utf8>>, 602}; {compilation_errors, _} -> {error_code, <<"multiple"/utf8>>, 0} end. -file("src/caffeine_lang/errors.gleam", 207). ?DOC(false). -spec error_context(compilation_error()) -> error_context(). error_context(Error) -> case Error of {frontend_parse_error, _, Context} -> Context; {frontend_validation_error, _, Context@1} -> Context@1; {linker_value_validation_error, _, Context@2} -> Context@2; {linker_duplicate_error, _, Context@3} -> Context@3; {linker_parse_error, _, Context@4} -> Context@4; {linker_vendor_resolution_error, _, Context@5} -> Context@5; {semantic_analysis_template_parse_error, _, Context@6} -> Context@6; {semantic_analysis_template_resolution_error, _, Context@7} -> Context@7; {semantic_analysis_dependency_validation_error, _, Context@8} -> Context@8; {generator_slo_query_resolution_error, _, Context@9} -> Context@9; {generator_terraform_resolution_error, _, _, Context@10} -> Context@10; {c_q_l_resolver_error, _, Context@11} -> Context@11; {c_q_l_parser_error, _, Context@12} -> Context@12; {compilation_errors, _} -> empty_context() end. -file("src/caffeine_lang/errors.gleam", 307). ?DOC(" Sets the identifier field on an ErrorContext, preserving existing value if already set.\n"). -spec set_context_identifier(error_context(), binary()) -> error_context(). set_context_identifier(Context, Identifier) -> case erlang:element(2, Context) of {some, _} -> Context; none -> {error_context, {some, Identifier}, erlang:element(3, Context), erlang:element(4, Context), erlang:element(5, Context), erlang:element(6, Context)} end. -file("src/caffeine_lang/errors.gleam", 229). ?DOC(false). -spec prefix_error(compilation_error(), binary()) -> compilation_error(). prefix_error(Error, Identifier) -> Prefix = <>, case Error of {frontend_parse_error, Msg, Context} -> {frontend_parse_error, <>, set_context_identifier(Context, Identifier)}; {frontend_validation_error, Msg@1, Context@1} -> {frontend_validation_error, <>, set_context_identifier(Context@1, Identifier)}; {linker_value_validation_error, Msg@2, Context@2} -> {linker_value_validation_error, <>, set_context_identifier(Context@2, Identifier)}; {linker_duplicate_error, Msg@3, Context@3} -> {linker_duplicate_error, <>, set_context_identifier(Context@3, Identifier)}; {linker_parse_error, Msg@4, Context@4} -> {linker_parse_error, <>, set_context_identifier(Context@4, Identifier)}; {linker_vendor_resolution_error, Msg@5, Context@5} -> {linker_vendor_resolution_error, <>, set_context_identifier(Context@5, Identifier)}; {semantic_analysis_template_parse_error, Msg@6, Context@6} -> {semantic_analysis_template_parse_error, <>, set_context_identifier(Context@6, Identifier)}; {semantic_analysis_template_resolution_error, Msg@7, Context@7} -> {semantic_analysis_template_resolution_error, <>, set_context_identifier(Context@7, Identifier)}; {semantic_analysis_dependency_validation_error, Msg@8, Context@8} -> {semantic_analysis_dependency_validation_error, <>, set_context_identifier(Context@8, Identifier)}; {generator_slo_query_resolution_error, Msg@9, Context@9} -> {generator_slo_query_resolution_error, <>, set_context_identifier(Context@9, Identifier)}; {generator_terraform_resolution_error, Vendor, Msg@10, Context@10} -> {generator_terraform_resolution_error, Vendor, <>, set_context_identifier(Context@10, Identifier)}; {c_q_l_resolver_error, Msg@11, Context@11} -> {c_q_l_resolver_error, <>, set_context_identifier(Context@11, Identifier)}; {c_q_l_parser_error, Msg@12, Context@12} -> {c_q_l_parser_error, <>, set_context_identifier(Context@12, Identifier)}; {compilation_errors, Errors} -> {compilation_errors, gleam@list:map( Errors, fun(_capture) -> prefix_error(_capture, Identifier) end )} end. -file("src/caffeine_lang/errors.gleam", 320). ?DOC(false). -spec to_list(compilation_error()) -> list(compilation_error()). to_list(Error) -> case Error of {compilation_errors, Errors} -> gleam@list:flat_map(Errors, fun to_list/1); _ -> [Error] end. -file("src/caffeine_lang/errors.gleam", 330). ?DOC(false). -spec to_message(compilation_error()) -> binary(). to_message(Error) -> case Error of {compilation_errors, Errors} -> _pipe = Errors, _pipe@1 = gleam@list:flat_map(_pipe, fun to_list/1), _pipe@2 = gleam@list:map(_pipe@1, fun to_message/1), gleam@string:join(_pipe@2, <<"\n"/utf8>>); {frontend_parse_error, Msg, _} -> Msg; {frontend_validation_error, Msg@1, _} -> Msg@1; {linker_value_validation_error, Msg@2, _} -> Msg@2; {linker_duplicate_error, Msg@3, _} -> Msg@3; {linker_parse_error, Msg@4, _} -> Msg@4; {linker_vendor_resolution_error, Msg@5, _} -> Msg@5; {semantic_analysis_template_parse_error, Msg@6, _} -> Msg@6; {semantic_analysis_template_resolution_error, Msg@7, _} -> Msg@7; {semantic_analysis_dependency_validation_error, Msg@8, _} -> Msg@8; {generator_slo_query_resolution_error, Msg@9, _} -> Msg@9; {generator_terraform_resolution_error, _, Msg@10, _} -> Msg@10; {c_q_l_resolver_error, Msg@11, _} -> Msg@11; {c_q_l_parser_error, Msg@12, _} -> Msg@12 end. -file("src/caffeine_lang/errors.gleam", 367). -spec partition_results( list({ok, GUV} | {error, compilation_error()}), list(GUV), list(compilation_error()) ) -> {list(GUV), list(compilation_error())}. partition_results(Results, Successes, Failures) -> case Results of [] -> {Successes, Failures}; [{ok, Val} | Rest] -> partition_results(Rest, [Val | Successes], Failures); [{error, Err} | Rest@1] -> partition_results(Rest@1, Successes, [Err | Failures]) end. -file("src/caffeine_lang/errors.gleam", 356). ?DOC(false). -spec from_results(list({ok, GUO} | {error, compilation_error()})) -> {ok, list(GUO)} | {error, compilation_error()}. from_results(Results) -> {Successes, Failures} = partition_results(Results, [], []), case Failures of [] -> {ok, lists:reverse(Successes)}; [Single] -> {error, Single}; Multiple -> {error, {compilation_errors, lists:reverse(Multiple)}} end. -file("src/caffeine_lang/errors.gleam", 381). ?DOC(" Normalizes type names across targets (JS uses \"Array\", Erlang uses \"List\").\n"). -spec normalize_type_name(binary()) -> binary(). normalize_type_name(Name) -> case Name of <<"Array"/utf8>> -> <<"List"/utf8>>; Other -> Other end. -file("src/caffeine_lang/errors.gleam", 390). ?DOC(false). -spec format_validation_error_message( list(caffeine_lang@types:validation_error()), gleam@option:option(binary()), gleam@option:option(caffeine_lang@value:value()) ) -> binary(). format_validation_error_message(Errors, Type_key_identifier, Val) -> Value_part = case Val of {some, V} -> <<<<" value ("/utf8, (caffeine_lang@value:to_preview_string(V))/binary>>/binary, ")"/utf8>>; none -> <<""/utf8>> end, _pipe = Errors, _pipe@2 = gleam@list:map( _pipe, fun(Error) -> <<<<<<<<<<<<<<<<"expected ("/utf8, (erlang:element(2, Error))/binary>>/binary, ") received ("/utf8>>/binary, (normalize_type_name( erlang:element(3, Error) ))/binary>>/binary, ")"/utf8>>/binary, Value_part/binary>>/binary, " for ("/utf8>>/binary, ((case {begin _pipe@1 = erlang:element(4, Error), gleam@string:join(_pipe@1, <<"."/utf8>>) end, Type_key_identifier} of {<<""/utf8>>, none} -> <<"Unknown"/utf8>>; {Path, none} -> Path; {<<""/utf8>>, {some, Val@1}} -> Val@1; {Path@1, {some, Val@2}} -> <<<>/binary, Path@1/binary>> end))/binary>>/binary, ")"/utf8>> end ), gleam@string:join(_pipe@2, <<", "/utf8>>).