Current section
Files
Jump to
Current section
Files
lib/ulid_flake_config.ex
defmodule UlidFlake.Config do
use Agent
@default_epoch_sec 1704067200 # 2024-01-01 00:00:00 UTC
@min_entropy_size 1
@max_entropy_size 3
def start_link(opts \\ []) do
Agent.start_link(fn -> default_config(opts || []) end, name: __MODULE__)
end
defp default_config(opts) do
epoch_time = Keyword.get(opts, :epoch_time, @default_epoch_sec)
entropy_size = Keyword.get(opts, :entropy_size, @min_entropy_size)
if DateTime.from_unix(epoch_time) == nil do
raise ArgumentError, "Invalid epoch time"
end
if entropy_size < @min_entropy_size or entropy_size > @max_entropy_size do
raise ArgumentError, "Invalid entropy size"
end
%{
epoch_time: DateTime.from_unix!(epoch_time), # Default epoch time (2024-01-01 00:00:00 UTC)
entropy_size: entropy_size, # Default entropy size (1 byte)
}
end
def set_epoch_time(epoch_time) do
Agent.update(__MODULE__, fn state -> %{state | epoch_time: epoch_time} end)
end
def set_entropy_size(entropy_size) when entropy_size >= @min_entropy_size and entropy_size <= @max_entropy_size do
Agent.update(__MODULE__, fn state -> %{state | entropy_size: entropy_size} end)
end
def set_entropy_size(_entropy_size) do
{:error, :invalid_entropy_size}
end
def get_config do
Agent.get(__MODULE__, & &1)
end
end