-module(ids@uuid). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([cast/1, generate_v4/0, generate_v7_from_timestamp/1, generate_v7/0, dump/1, decode_v7/1]). -spec e(integer()) -> integer(). e(N) -> case N of 0 -> 48; 1 -> 49; 2 -> 50; 3 -> 51; 4 -> 52; 5 -> 53; 6 -> 54; 7 -> 55; 8 -> 56; 9 -> 57; 10 -> 97; 11 -> 98; 12 -> 99; 13 -> 100; 14 -> 101; 15 -> 102; _ -> 102 end. -spec cast(bitstring()) -> {ok, binary()} | {error, binary()}. cast(Raw_uuid) -> case Raw_uuid of <> -> _pipe = <<(e(A1)), (e(A2)), (e(A3)), (e(A4)), (e(A5)), (e(A6)), (e(A7)), (e(A8)), 45, (e(B1)), (e(B2)), (e(B3)), (e(B4)), 45, (e(C1)), (e(C2)), (e(C3)), (e(C4)), 45, (e(D1)), (e(D2)), (e(D3)), (e(D4)), 45, (e(E1)), (e(E2)), (e(E3)), (e(E4)), (e(E5)), (e(E6)), (e(E7)), (e(E8)), (e(E9)), (e(E10)), (e(E11)), (e(E12))>>, _pipe@1 = gleam@bit_array:to_string(_pipe), gleam@result:replace_error( _pipe@1, <<"Error: BitString could not be converted to String."/utf8>> ); _ -> {error, <<"Error: Raw UUID is malformed."/utf8>>} end. -spec generate_v4() -> {ok, binary()} | {error, binary()}. generate_v4() -> _assert_subject = crypto:strong_rand_bytes(16), <> = case _assert_subject of <<_:48, _:4, _:12, _:2, _:62>> -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"ids/uuid"/utf8>>, function => <<"generate_v4"/utf8>>, line => 26}) end, cast(<>). -spec generate_v7_from_timestamp(integer()) -> {ok, binary()} | {error, binary()}. generate_v7_from_timestamp(Timestamp) -> _assert_subject = crypto:strong_rand_bytes(16), <<_:48, _:4, A:12, _:2, B:62>> = case _assert_subject of <<_:48, _:4, _:12, _:2, _:62>> -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"ids/uuid"/utf8>>, function => <<"generate_v7_from_timestamp"/utf8>>, line => 50}) end, cast(<>). -spec generate_v7() -> {ok, binary()} | {error, binary()}. generate_v7() -> Timestamp = os:system_time(millisecond), generate_v7_from_timestamp(Timestamp). -spec d(integer()) -> integer(). d(N) -> case N of 48 -> 0; 49 -> 1; 50 -> 2; 51 -> 3; 52 -> 4; 53 -> 5; 54 -> 6; 55 -> 7; 56 -> 8; 57 -> 9; 97 -> 10; 98 -> 11; 99 -> 12; 100 -> 13; 101 -> 14; 102 -> 15; _ -> 15 end. -spec dump(bitstring()) -> {ok, bitstring()} | {error, binary()}. dump(Uuid) -> case Uuid of <> -> _pipe = <<(d(A1)):4, (d(A2)):4, (d(A3)):4, (d(A4)):4, (d(A5)):4, (d(A6)):4, (d(A7)):4, (d(A8)):4, (d(B1)):4, (d(B2)):4, (d(B3)):4, (d(B4)):4, (d(C1)):4, (d(C2)):4, (d(C3)):4, (d(C4)):4, (d(D1)):4, (d(D2)):4, (d(D3)):4, (d(D4)):4, (d(E1)):4, (d(E2)):4, (d(E3)):4, (d(E4)):4, (d(E5)):4, (d(E6)):4, (d(E7)):4, (d(E8)):4, (d(E9)):4, (d(E10)):4, (d(E11)):4, (d(E12)):4>>, {ok, _pipe}; _ -> {error, <<"Error: UUID is malformed."/utf8>>} end. -spec decode_v7(binary()) -> {ok, {integer(), integer(), bitstring(), integer(), bitstring()}} | {error, binary()}. decode_v7(Uuid_v7) -> _pipe = Uuid_v7, _pipe@1 = gleam_stdlib:identity(_pipe), _pipe@2 = dump(_pipe@1), gleam@result:'try'(_pipe@2, fun(D) -> case D of <> -> {ok, {Timestamp, Ver, A, Var, B}}; _ -> {error, <<"Error: Couldn't match raw UUID v7."/utf8>>} end end).