src/qrkit@internal@version.erl

-module(qrkit@internal@version).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/qrkit/internal/version.gleam").
-export([is_valid/1, symbol_size/1, total_codewords/1, ec_blocks/2, ec_total_codewords/2, data_codewords/2, data_capacity_bits/2, best_version_for_bits/3]).

-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(false).

-file("src/qrkit/internal/version.gleam", 38).
?DOC(false).
-spec is_valid(integer()) -> boolean().
is_valid(Version) ->
    (Version >= 1) andalso (Version =< 40).

-file("src/qrkit/internal/version.gleam", 42).
?DOC(false).
-spec symbol_size(integer()) -> {ok, integer()} |
    {error, qrkit@error:encode_error()}.
symbol_size(Version) ->
    case is_valid(Version) of
        true ->
            {ok, (Version * 4) + 17};

        false ->
            {error, {invalid_version, Version}}
    end.

-file("src/qrkit/internal/version.gleam", 134).
?DOC(false).
-spec ecc_index(qrkit@types:error_correction()) -> integer().
ecc_index(Ecc) ->
    case Ecc of
        low ->
            0;

        medium ->
            1;

        quartile ->
            2;

        high ->
            3
    end.

-file("src/qrkit/internal/version.gleam", 120).
?DOC(false).
-spec lookup_by_ecc(list(integer()), integer(), qrkit@types:error_correction()) -> {ok,
        integer()} |
    {error, qrkit@error:encode_error()}.
lookup_by_ecc(Table, Version, Ecc) ->
    case is_valid(Version) of
        false ->
            {error, {invalid_version, Version}};

        true ->
            Offset = ((Version - 1) * 4) + ecc_index(Ecc),
            {ok, qrkit@internal@util:at_or(Table, Offset, 0)}
    end.

-file("src/qrkit/internal/version.gleam", 49).
?DOC(false).
-spec total_codewords(integer()) -> {ok, integer()} |
    {error, qrkit@error:encode_error()}.
total_codewords(Version) ->
    case is_valid(Version) of
        true ->
            {ok,
                qrkit@internal@util:at_or(
                    [0,
                        26,
                        44,
                        70,
                        100,
                        134,
                        172,
                        196,
                        242,
                        292,
                        346,
                        404,
                        466,
                        532,
                        581,
                        655,
                        733,
                        815,
                        901,
                        991,
                        1085,
                        1156,
                        1258,
                        1364,
                        1474,
                        1588,
                        1706,
                        1828,
                        1921,
                        2051,
                        2185,
                        2323,
                        2465,
                        2611,
                        2761,
                        2876,
                        3034,
                        3196,
                        3362,
                        3532,
                        3706],
                    Version,
                    0
                )};

        false ->
            {error, {invalid_version, Version}}
    end.

-file("src/qrkit/internal/version.gleam", 63).
?DOC(false).
-spec ec_blocks(integer(), qrkit@types:error_correction()) -> {ok, integer()} |
    {error, qrkit@error:encode_error()}.
ec_blocks(Version, Ecc) ->
    lookup_by_ecc(
        [1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            2,
            2,
            1,
            2,
            2,
            4,
            1,
            2,
            4,
            4,
            2,
            4,
            4,
            4,
            2,
            4,
            6,
            5,
            2,
            4,
            6,
            6,
            2,
            5,
            8,
            8,
            4,
            5,
            8,
            8,
            4,
            5,
            8,
            11,
            4,
            8,
            10,
            11,
            4,
            9,
            12,
            16,
            4,
            9,
            16,
            16,
            6,
            10,
            12,
            18,
            6,
            10,
            17,
            16,
            6,
            11,
            16,
            19,
            6,
            13,
            18,
            21,
            7,
            14,
            21,
            25,
            8,
            16,
            20,
            25,
            8,
            17,
            23,
            25,
            9,
            17,
            23,
            34,
            9,
            18,
            25,
            30,
            10,
            20,
            27,
            32,
            12,
            21,
            29,
            35,
            12,
            23,
            34,
            37,
            12,
            25,
            34,
            40,
            13,
            26,
            35,
            42,
            14,
            28,
            38,
            45,
            15,
            29,
            40,
            48,
            16,
            31,
            43,
            51,
            17,
            33,
            45,
            54,
            18,
            35,
            48,
            57,
            19,
            37,
            51,
            60,
            19,
            38,
            53,
            63,
            20,
            40,
            56,
            66,
            21,
            43,
            59,
            70,
            22,
            45,
            62,
            74,
            24,
            47,
            65,
            77,
            25,
            49,
            68,
            81],
        Version,
        Ecc
    ).

-file("src/qrkit/internal/version.gleam", 56).
?DOC(false).
-spec ec_total_codewords(integer(), qrkit@types:error_correction()) -> {ok,
        integer()} |
    {error, qrkit@error:encode_error()}.
ec_total_codewords(Version, Ecc) ->
    lookup_by_ecc(
        [7,
            10,
            13,
            17,
            10,
            16,
            22,
            28,
            15,
            26,
            36,
            44,
            20,
            36,
            52,
            64,
            26,
            48,
            72,
            88,
            36,
            64,
            96,
            112,
            40,
            72,
            108,
            130,
            48,
            88,
            132,
            156,
            60,
            110,
            160,
            192,
            72,
            130,
            192,
            224,
            80,
            150,
            224,
            264,
            96,
            176,
            260,
            308,
            104,
            198,
            288,
            352,
            120,
            216,
            320,
            384,
            132,
            240,
            360,
            432,
            144,
            280,
            408,
            480,
            168,
            308,
            448,
            532,
            180,
            338,
            504,
            588,
            196,
            364,
            546,
            650,
            224,
            416,
            600,
            700,
            224,
            442,
            644,
            750,
            252,
            476,
            690,
            816,
            270,
            504,
            750,
            900,
            300,
            560,
            810,
            960,
            312,
            588,
            870,
            1050,
            336,
            644,
            952,
            1110,
            360,
            700,
            1020,
            1200,
            390,
            728,
            1050,
            1260,
            420,
            784,
            1140,
            1350,
            450,
            812,
            1200,
            1440,
            480,
            868,
            1290,
            1530,
            510,
            924,
            1350,
            1620,
            540,
            980,
            1440,
            1710,
            570,
            1036,
            1530,
            1800,
            570,
            1064,
            1590,
            1890,
            600,
            1120,
            1680,
            1980,
            630,
            1204,
            1770,
            2100,
            660,
            1260,
            1860,
            2220,
            720,
            1316,
            1950,
            2310,
            750,
            1372,
            2040,
            2430],
        Version,
        Ecc
    ).

-file("src/qrkit/internal/version.gleam", 67).
?DOC(false).
-spec data_codewords(integer(), qrkit@types:error_correction()) -> {ok,
        integer()} |
    {error, qrkit@error:encode_error()}.
data_codewords(Version, Ecc) ->
    case {total_codewords(Version), ec_total_codewords(Version, Ecc)} of
        {{ok, Total}, {ok, Ec}} ->
            {ok, Total - Ec};

        {{error, Error}, _} ->
            {error, Error};

        {_, {error, Error@1}} ->
            {error, Error@1}
    end.

-file("src/qrkit/internal/version.gleam", 78).
?DOC(false).
-spec data_capacity_bits(integer(), qrkit@types:error_correction()) -> {ok,
        integer()} |
    {error, qrkit@error:encode_error()}.
data_capacity_bits(Version, Ecc) ->
    case data_codewords(Version, Ecc) of
        {ok, Codewords} ->
            {ok, Codewords * 8};

        {error, Error} ->
            {error, Error}
    end.

-file("src/qrkit/internal/version.gleam", 96).
?DOC(false).
-spec do_best_version(integer(), qrkit@types:error_correction(), integer()) -> {ok,
        integer()} |
    {error, qrkit@error:encode_error()}.
do_best_version(Bits_needed, Ecc, Candidate) ->
    case Candidate > 40 of
        true ->
            case data_capacity_bits(40, Ecc) of
                {ok, Bits_available} ->
                    {error,
                        {data_exceeds_capacity, Bits_needed, Bits_available}};

                {error, Error} ->
                    {error, Error}
            end;

        false ->
            case data_capacity_bits(Candidate, Ecc) of
                {ok, Bits_available@1} ->
                    case Bits_needed =< Bits_available@1 of
                        true ->
                            {ok, Candidate};

                        false ->
                            do_best_version(Bits_needed, Ecc, Candidate + 1)
                    end;

                {error, Error@1} ->
                    {error, Error@1}
            end
    end.

-file("src/qrkit/internal/version.gleam", 88).
?DOC(false).
-spec best_version_for_bits(
    integer(),
    qrkit@types:error_correction(),
    integer()
) -> {ok, integer()} | {error, qrkit@error:encode_error()}.
best_version_for_bits(Bits_needed, Ecc, Min_version) ->
    do_best_version(Bits_needed, Ecc, Min_version).