-module(packkit@error).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/packkit/error.gleam").
-export([format_codec_error/1, format_archive_error/1, format_detect_error/1, format_recipe_error/1]).
-export_type([codec_error/0, archive_error/0, recipe_error/0, detect_error/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.
?MODULEDOC(
" Shared public error families for the `packkit` facade and the\n"
" early scaffold modules.\n"
).
-type codec_error() :: {codec_invalid_data, binary()} |
{codec_limit_exceeded, binary(), integer()} |
{codec_dictionary_required, binary()} |
{codec_dictionary_mismatch, binary()} |
{codec_option_unsupported, binary(), binary()} |
{codec_not_implemented, binary()}.
-type archive_error() :: {archive_unsupported, binary()} |
{archive_invalid, binary()} |
{archive_entry_rejected, binary(), binary()} |
{archive_limit_exceeded, binary(), integer()} |
{archive_not_implemented, binary()} |
{archive_codec_failed, binary(), codec_error()} |
{archive_format_mismatch, binary(), binary()} |
{archive_field_overflow, binary(), integer(), integer()} |
{archive_comment_unsupported, binary()}.
-type recipe_error() :: {recipe_archive_already_set, binary()} |
recipe_empty_codec_chain |
{recipe_unsupported_composition, binary()} |
{recipe_not_implemented, binary()}.
-type detect_error() :: {detect_unknown_format, binary()} |
{detect_not_implemented, binary()}.
-file("src/packkit/error.gleam", 70).
?DOC(
" Format a `CodecError` as a single user-facing line. Hides the\n"
" constructor names and field labels that `string.inspect` would\n"
" expose, so the output is suitable for CLI error reporting.\n"
).
-spec format_codec_error(codec_error()) -> binary().
format_codec_error(Err) ->
case Err of
{codec_invalid_data, Message} ->
<<"codec: invalid data — "/utf8, Message/binary>>;
{codec_limit_exceeded, Limit, Actual} ->
<<<<<<<<"codec: limit \""/utf8, Limit/binary>>/binary,
"\" exceeded (actual="/utf8>>/binary,
(erlang:integer_to_binary(Actual))/binary>>/binary,
")"/utf8>>;
{codec_dictionary_required, Name} ->
<<<<"codec: "/utf8, Name/binary>>/binary,
" requires a preset dictionary"/utf8>>;
{codec_dictionary_mismatch, Name@1} ->
<<<<"codec: "/utf8, Name@1/binary>>/binary,
" preset-dictionary id mismatch"/utf8>>;
{codec_option_unsupported, Option, Codec_name} ->
<<<<<<<<"codec: "/utf8, Codec_name/binary>>/binary,
" does not support the requested option \""/utf8>>/binary,
Option/binary>>/binary,
"\""/utf8>>;
{codec_not_implemented, Feature} ->
<<"codec: not yet implemented — "/utf8, Feature/binary>>
end.
-file("src/packkit/error.gleam", 96).
?DOC(
" Format an `ArchiveError` as a single user-facing line. Nested\n"
" `CodecError` (under `ArchiveCodecFailed`) is rendered through\n"
" `format_codec_error` so the user sees one continuous sentence.\n"
).
-spec format_archive_error(archive_error()) -> binary().
format_archive_error(Err) ->
case Err of
{archive_unsupported, Name} ->
<<<<"archive: unsupported format \""/utf8, Name/binary>>/binary,
"\""/utf8>>;
{archive_invalid, Message} ->
<<"archive: invalid — "/utf8, Message/binary>>;
{archive_entry_rejected, Path, Reason} ->
<<<<<<"archive: entry \""/utf8, Path/binary>>/binary,
"\" rejected — "/utf8>>/binary,
Reason/binary>>;
{archive_limit_exceeded, Limit, Actual} ->
<<<<<<<<"archive: limit \""/utf8, Limit/binary>>/binary,
"\" exceeded (actual="/utf8>>/binary,
(erlang:integer_to_binary(Actual))/binary>>/binary,
")"/utf8>>;
{archive_not_implemented, Feature} ->
<<"archive: not yet implemented — "/utf8, Feature/binary>>;
{archive_codec_failed, Step, Cause} ->
<<<<<<"archive: "/utf8, Step/binary>>/binary, " step — "/utf8>>/binary,
(format_codec_error(Cause))/binary>>;
{archive_format_mismatch, Archive, Requested} ->
<<<<<<<<"archive: format mismatch (archive was built as \""/utf8,
Archive/binary>>/binary,
"\" but \""/utf8>>/binary,
Requested/binary>>/binary,
"\" was requested)"/utf8>>;
{archive_field_overflow, Field, Value, Max} ->
<<<<<<<<<<<<"archive: field \""/utf8, Field/binary>>/binary,
"\" overflow (value="/utf8>>/binary,
(erlang:integer_to_binary(Value))/binary>>/binary,
", max="/utf8>>/binary,
(erlang:integer_to_binary(Max))/binary>>/binary,
")"/utf8>>;
{archive_comment_unsupported, Format} ->
<<<<"archive: format \""/utf8, Format/binary>>/binary,
"\" does not carry archive comments"/utf8>>
end.
-file("src/packkit/error.gleam", 132).
?DOC(" Format a `DetectError` as a single user-facing line.\n").
-spec format_detect_error(detect_error()) -> binary().
format_detect_error(Err) ->
case Err of
{detect_unknown_format, Input} ->
<<<<"detect: could not classify input \""/utf8, Input/binary>>/binary,
"\""/utf8>>;
{detect_not_implemented, Feature} ->
<<"detect: not yet implemented — "/utf8, Feature/binary>>
end.
-file("src/packkit/error.gleam", 141).
?DOC(" Format a `RecipeError` as a single user-facing line.\n").
-spec format_recipe_error(recipe_error()) -> binary().
format_recipe_error(Err) ->
case Err of
{recipe_archive_already_set, Current} ->
<<<<"recipe: archive layer is already set to \""/utf8,
Current/binary>>/binary,
"\""/utf8>>;
recipe_empty_codec_chain ->
<<"recipe: codec chain is empty"/utf8>>;
{recipe_unsupported_composition, Description} ->
<<"recipe: unsupported composition — "/utf8, Description/binary>>;
{recipe_not_implemented, Feature} ->
<<"recipe: not yet implemented — "/utf8, Feature/binary>>
end.