Current section
Files
Jump to
Current section
Files
src/glecuid@internals@core.erl
-module(glecuid@internals@core).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glecuid/internals/core.gleam").
-export([is_cuid/1, with_counter/2, with_random_counter/1, with_fingerprint/2, with_length/2, with_randomizer/2, new/0, generate/2]).
-export_type([generator/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(false).
-opaque generator() :: {generator,
gleam@option:option(fun(() -> integer())),
gleam@option:option(binary()),
integer(),
fun(() -> float())}.
-file("src/glecuid/internals/core.gleam", 94).
?DOC(false).
-spec is_cuid(binary()) -> boolean().
is_cuid(Input) ->
Length = begin
_pipe = Input,
string:length(_pipe)
end,
Regex@1 = case gleam@regexp:from_string(<<"^[a-z][0-9a-z]+$"/utf8>>) of
{ok, Regex} -> Regex;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"glecuid/internals/core"/utf8>>,
function => <<"is_cuid"/utf8>>,
line => 96,
value => _assert_fail,
start => 2235,
'end' => 2296,
pattern_start => 2246,
pattern_end => 2255})
end,
case gleam@regexp:check(Regex@1, Input) of
true when (2 =< Length) andalso (Length =< 32) ->
true;
_ ->
false
end.
-file("src/glecuid/internals/core.gleam", 117).
?DOC(false).
-spec with_counter(generator(), fun(() -> integer())) -> generator().
with_counter(G, Counter) ->
{generator,
begin
_pipe = Counter,
{some, _pipe}
end,
erlang:element(3, G),
erlang:element(4, G),
erlang:element(5, G)}.
-file("src/glecuid/internals/core.gleam", 125).
?DOC(false).
-spec with_random_counter(generator()) -> generator().
with_random_counter(G) ->
{generator,
{some, fun() -> gleam@int:random(32) end},
erlang:element(3, G),
erlang:element(4, G),
erlang:element(5, G)}.
-file("src/glecuid/internals/core.gleam", 134).
?DOC(false).
-spec with_fingerprint(generator(), binary()) -> generator().
with_fingerprint(G, Fingerprint) ->
{generator,
erlang:element(2, G),
begin
_pipe = Fingerprint,
{some, _pipe}
end,
erlang:element(4, G),
erlang:element(5, G)}.
-file("src/glecuid/internals/core.gleam", 140).
?DOC(false).
-spec with_length(generator(), integer()) -> generator().
with_length(G, Length) ->
{generator,
erlang:element(2, G),
erlang:element(3, G),
Length,
erlang:element(5, G)}.
-file("src/glecuid/internals/core.gleam", 149).
?DOC(false).
-spec with_randomizer(generator(), fun(() -> float())) -> generator().
with_randomizer(G, Randomizer) ->
{generator,
erlang:element(2, G),
erlang:element(3, G),
erlang:element(4, G),
Randomizer}.
-file("src/glecuid/internals/core.gleam", 108).
?DOC(false).
-spec new() -> generator().
new() ->
{generator, none, none, 24, fun rand:uniform/0}.
-file("src/glecuid/internals/core.gleam", 56).
?DOC(false).
-spec generate(generator(), fun((binary()) -> binary())) -> binary().
generate(G, Hasher) ->
{generator, Counter, Fingerprint, Length, Randomizer} = G,
First_letter = glecuid@internals@util:random_letter(Randomizer),
Time = begin
_pipe = gleam@time@timestamp:system_time(),
_pipe@1 = gleam@time@timestamp:to_unix_seconds_and_nanoseconds(_pipe),
_pipe@2 = gleam@pair:first(_pipe@1),
gleam@int:to_base36(_pipe@2)
end,
Count = begin
_pipe@4 = case Counter of
{some, X} ->
X();
none ->
_pipe@3 = glecuid@internals@util:random_int(
Randomizer,
476782367
),
glecuid_ffi:bump_or_initialize_counter(_pipe@3)
end,
gleam@int:to_base36(_pipe@4)
end,
Fingerprint@1 = case Fingerprint of
{some, X@1} ->
X@1;
none ->
glecuid@internals@util:create_fingerprint(Randomizer, Hasher)
end,
Salt = glecuid@internals@util:create_entropy(Randomizer, Length),
<<First_letter/binary,
(begin
_pipe@5 = (<<<<<<Time/binary, Salt/binary>>/binary, Count/binary>>/binary,
Fingerprint@1/binary>>),
_pipe@6 = Hasher(_pipe@5),
_pipe@7 = gleam@string:slice(_pipe@6, 1, Length - 1),
string:lowercase(_pipe@7)
end)/binary>>.