Packages

A package for generating readable, context-rich IDs.

Current section

Files

Jump to
context_id lib context_id.ex
Raw

lib/context_id.ex

defmodule ContextID do
@moduledoc """
A module for generating custom identifiers.
"""
@doc """
Generates a custom identifier with a specified `prefix` and of a specified `length`.
"""
def generate_id(prefix \\ default_prefix(), length \\ default_length()) do
validate_parameters(prefix, length)
random_part = :crypto.strong_rand_bytes(length)
|> Base.encode16(case: :lower)
"#{prefix}_#{random_part}"
end
@doc """
Gets the default prefix for generated identifiers.
The default prefix is used when no prefix is provided during ID generation.
"""
def default_prefix do
Application.get_env(:contextual_id, :default_prefix, "id")
end
@doc """
Gets the default length for generated identifiers.
The default length is used when no length is provided during ID generation.
"""
def default_length do
Application.get_env(:contextual_id, :default_length, 16)
end
defp validate_parameters(prefix, length) do
validate_prefix(prefix)
validate_length(length)
end
defp validate_prefix(prefix) when is_binary(prefix), do: :ok
defp validate_prefix(_), do: raise(ArgumentError, "Prefix must be a string")
defp validate_length(length) when is_integer(length) and length > 0, do: :ok
defp validate_length(_), do: raise(ArgumentError, "Length must be a positive integer")
end