Packages
corex
0.1.0-rc.1
0.1.2
0.1.1
0.1.0
0.1.0-rc.1
0.1.0-rc.0
0.1.0-beta.5
0.1.0-beta.4
0.1.0-beta.3
0.1.0-beta.2
0.1.0-beta.1
0.1.0-alpha.33
0.1.0-alpha.32
0.1.0-alpha.31
0.1.0-alpha.30
0.1.0-alpha.29
0.1.0-alpha.28
0.1.0-alpha.27
0.1.0-alpha.26
0.1.0-alpha.25
0.1.0-alpha.24
0.1.0-alpha.23
0.1.0-alpha.22
0.1.0-alpha.21
0.1.0-alpha.20
0.1.0-alpha.19
0.1.0-alpha.18
0.1.0-alpha.17
0.1.0-alpha.16
0.1.0-alpha.15
0.1.0-alpha.14
0.1.0-alpha.13
0.1.0-alpha.12
0.1.0-alpha.11
0.1.0-alpha.10
0.1.0-alpha.9
0.1.0-alpha.8
0.1.0-alpha.7
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
Accessible and unstyled UI components library written in Elixir and TypeScript that integrates Zag.js state machines into the Phoenix Framework.
Current section
Files
Jump to
Current section
Files
lib/corex/item_builder.ex
defmodule Corex.ItemBuilder do
@moduledoc false
def generate_id(prefix) when is_binary(prefix) do
"#{prefix}-#{System.unique_integer([:positive])}"
end
def build_item(module, attrs, opts \\ []) when is_atom(module) do
index = Keyword.get(opts, :index)
id_prefix = Keyword.get(opts, :id_prefix)
required_fields = Keyword.fetch!(opts, :required_fields)
optional_fields = Keyword.get(opts, :optional_fields, [])
example = Keyword.fetch!(opts, :example)
try do
attrs =
attrs
|> normalize_attrs()
|> maybe_put_index_value(index, id_prefix)
struct!(module, attrs)
rescue
e in [KeyError, ArgumentError] ->
reraise ArgumentError,
"""
Failed to create #{inspect(module)}: #{Exception.message(e)}
Required fields: #{inspect(required_fields)}
Optional fields: #{inspect(optional_fields)}
Example:
#{example}
""",
__STACKTRACE__
end
end
defp normalize_attrs(attrs) when is_map(attrs), do: attrs
defp normalize_attrs(attrs) when is_list(attrs) do
if Keyword.keyword?(attrs) do
Enum.into(attrs, %{})
else
attrs
end
end
defp maybe_put_index_value(attrs, nil, nil), do: attrs
defp maybe_put_index_value(attrs, index, _prefix) when is_integer(index) do
Map.put_new(attrs, :value, "item-#{index}")
end
defp maybe_put_index_value(attrs, _index, prefix) when is_binary(prefix) do
Map.put_new_lazy(attrs, :value, fn -> generate_id(prefix) end)
end
end