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