# # Implementation from https://github.com/elixir-ecto/ecto/blob/v3.8.4/lib/ecto/uuid.ex # Apache License 2.0 https://github.com/elixir-ecto/ecto/blob/master/LICENSE.md # defmodule EventStore.UUID do @moduledoc false @typedoc """ A hex-encoded UUID string. """ @type hex :: <<_::288>> @typedoc """ A raw binary representation of a UUID. """ @type raw :: <<_::128>> @doc """ Generates a random, version 4 UUID. """ @spec uuid4() :: hex() def uuid4, do: bingenerate() |> hex_encode() @doc """ Converts a string representing a UUID into a raw binary. """ @spec string_to_binary!(hex()) :: raw() def string_to_binary!( <> ) do <> end @spec binary_to_string!(raw()) :: hex() def binary_to_string!(<<_::128>> = raw_uuid) do hex_encode(raw_uuid) end defp bingenerate do <> = :crypto.strong_rand_bytes(16) <> end defp hex_encode( <> ) do <> end @compile {:inline, d: 1} defp d(?0), do: 0 defp d(?1), do: 1 defp d(?2), do: 2 defp d(?3), do: 3 defp d(?4), do: 4 defp d(?5), do: 5 defp d(?6), do: 6 defp d(?7), do: 7 defp d(?8), do: 8 defp d(?9), do: 9 defp d(?A), do: 10 defp d(?B), do: 11 defp d(?C), do: 12 defp d(?D), do: 13 defp d(?E), do: 14 defp d(?F), do: 15 defp d(?a), do: 10 defp d(?b), do: 11 defp d(?c), do: 12 defp d(?d), do: 13 defp d(?e), do: 14 defp d(?f), do: 15 defp d(_), do: throw(:error) @compile {:inline, e: 1} defp e(0), do: ?0 defp e(1), do: ?1 defp e(2), do: ?2 defp e(3), do: ?3 defp e(4), do: ?4 defp e(5), do: ?5 defp e(6), do: ?6 defp e(7), do: ?7 defp e(8), do: ?8 defp e(9), do: ?9 defp e(10), do: ?a defp e(11), do: ?b defp e(12), do: ?c defp e(13), do: ?d defp e(14), do: ?e defp e(15), do: ?f end