Skip to main content

src/packkit@codec.erl

-module(packkit@codec).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/packkit/codec.gleam").
-export([identity/0, lz4/0, snappy/0, lzw/0, dictionary/1, dictionary_bytes/1, with_level/2, clear_level/1, with_dictionary/2, clear_dictionary/1, kind/1, name/1, level/1, gzip/0, zlib/0, deflate/0, bzip2/0, xz/0, brotli/0, zstd/0, dictionary_of/1, has_dictionary/1]).
-export_type([codec_kind/0, dictionary/0, codec/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 codec_kind() :: identity |
    deflate |
    zlib |
    gzip |
    lz4 |
    snappy |
    bzip2 |
    lzw |
    xz |
    zstd |
    brotli.

-opaque dictionary() :: {dictionary, bitstring()}.

-opaque codec() :: {codec,
        codec_kind(),
        gleam@option:option(packkit@level:level()),
        gleam@option:option(dictionary())}.

-file("src/packkit/codec.gleam", 36).
?DOC(" No-op codec useful for testing and raw recipe assembly.\n").
-spec identity() -> codec().
identity() ->
    {codec, identity, none, none}.

-file("src/packkit/codec.gleam", 56).
?DOC(" LZ4 frame format.\n").
-spec lz4() -> codec().
lz4() ->
    {codec, lz4, none, none}.

-file("src/packkit/codec.gleam", 61).
?DOC(" Snappy framed format.\n").
-spec snappy() -> codec().
snappy() ->
    {codec, snappy, none, none}.

-file("src/packkit/codec.gleam", 88).
?DOC(" Unix LZW `.Z` stream.\n").
-spec lzw() -> codec().
lzw() ->
    {codec, lzw, none, none}.

-file("src/packkit/codec.gleam", 93).
?DOC(" Build a dictionary value from raw bytes.\n").
-spec dictionary(bitstring()) -> dictionary().
dictionary(Bytes) ->
    {dictionary, Bytes}.

-file("src/packkit/codec.gleam", 98).
?DOC(" Access the raw bytes stored in a dictionary.\n").
-spec dictionary_bytes(dictionary()) -> bitstring().
dictionary_bytes(Dict) ->
    erlang:element(2, Dict).

-file("src/packkit/codec.gleam", 103).
?DOC(" Override the codec's compression level.\n").
-spec with_level(codec(), packkit@level:level()) -> codec().
with_level(Codec, Level) ->
    {codec, erlang:element(2, Codec), {some, Level}, erlang:element(4, Codec)}.

-file("src/packkit/codec.gleam", 108).
?DOC(" Remove any explicit level override.\n").
-spec clear_level(codec()) -> codec().
clear_level(Codec) ->
    {codec, erlang:element(2, Codec), none, erlang:element(4, Codec)}.

-file("src/packkit/codec.gleam", 113).
?DOC(" Attach a preset dictionary.\n").
-spec with_dictionary(codec(), dictionary()) -> codec().
with_dictionary(Codec, Dictionary) ->
    {codec,
        erlang:element(2, Codec),
        erlang:element(3, Codec),
        {some, Dictionary}}.

-file("src/packkit/codec.gleam", 118).
?DOC(" Remove any preset dictionary.\n").
-spec clear_dictionary(codec()) -> codec().
clear_dictionary(Codec) ->
    {codec, erlang:element(2, Codec), erlang:element(3, Codec), none}.

-file("src/packkit/codec.gleam", 123).
?DOC(" Internal tagged kind for the codec family.\n").
-spec kind(codec()) -> codec_kind().
kind(Codec) ->
    erlang:element(2, Codec).

-file("src/packkit/codec.gleam", 129).
?DOC(
    " Codec family name.  Kept for diagnostics and `description` output;\n"
    " internal dispatch uses [kind].\n"
).
-spec name(codec()) -> binary().
name(Codec) ->
    case erlang:element(2, Codec) of
        identity ->
            <<"identity"/utf8>>;

        deflate ->
            <<"deflate"/utf8>>;

        zlib ->
            <<"zlib"/utf8>>;

        gzip ->
            <<"gzip"/utf8>>;

        lz4 ->
            <<"lz4"/utf8>>;

        snappy ->
            <<"snappy"/utf8>>;

        bzip2 ->
            <<"bzip2"/utf8>>;

        lzw ->
            <<"lzw"/utf8>>;

        xz ->
            <<"xz"/utf8>>;

        zstd ->
            <<"zstd"/utf8>>;

        brotli ->
            <<"brotli"/utf8>>
    end.

-file("src/packkit/codec.gleam", 146).
?DOC(" Optional level override.\n").
-spec level(codec()) -> gleam@option:option(packkit@level:level()).
level(Codec) ->
    erlang:element(3, Codec).

-file("src/packkit/codec.gleam", 41).
?DOC(" Gzip wrapper over deflate.\n").
-spec gzip() -> codec().
gzip() ->
    {codec, gzip, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 46).
?DOC(" Zlib wrapper over deflate.\n").
-spec zlib() -> codec().
zlib() ->
    {codec, zlib, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 51).
?DOC(" Raw deflate stream.\n").
-spec deflate() -> codec().
deflate() ->
    {codec, deflate, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 68).
?DOC(
    " BZip2 stream.  Defaults to level 9 (900 KiB block size) to match\n"
    " the canonical `bzip2` default and the level `bzip2.encode` uses\n"
    " when no level is supplied explicitly.\n"
).
-spec bzip2() -> codec().
bzip2() ->
    {codec, bzip2, {some, packkit@level:custom(9)}, none}.

-file("src/packkit/codec.gleam", 73).
?DOC(" XZ stream.\n").
-spec xz() -> codec().
xz() ->
    {codec, xz, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 78).
?DOC(" Brotli stream.\n").
-spec brotli() -> codec().
brotli() ->
    {codec, brotli, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 83).
?DOC(" Zstandard stream.\n").
-spec zstd() -> codec().
zstd() ->
    {codec, zstd, {some, packkit@level:default()}, none}.

-file("src/packkit/codec.gleam", 151).
?DOC(" Optional dictionary.\n").
-spec dictionary_of(codec()) -> gleam@option:option(dictionary()).
dictionary_of(Codec) ->
    erlang:element(4, Codec).

-file("src/packkit/codec.gleam", 156).
?DOC(" `True` when a codec carries a preset dictionary.\n").
-spec has_dictionary(codec()) -> boolean().
has_dictionary(Codec) ->
    case erlang:element(4, Codec) of
        {some, _} ->
            true;

        none ->
            false
    end.