Current section
Files
Jump to
Current section
Files
lib/hugs/props_definition.ex
defmodule Hugs.PropsDefinition do
alias Hugs.FieldDefinition
@todo "rename to PropsDefinition"
@enforce_keys [:fields, :constraints]
defstruct @enforce_keys
def new() do
%__MODULE__{fields: %{}, constraints: []}
end
def add_field(%__MODULE__{} = this, %FieldDefinition{key: key} = field) do
Map.update!(this, :fields, fn fields -> Map.put_new(fields, key, field) end)
end
def add_constraint(%__MODULE__{} = this, module, fun, args) do
Map.update!(this, :constraints, fn constraints -> constraints ++ [{module, fun, args}] end)
end
def constraints(%__MODULE__{constraints: cs}), do: cs
def required_keys(%__MODULE__{fields: fields}) do
for {k, field} <- fields, field.required, do: k
end
def default_pairs(props_def, ignore_undef? \\ true)
def default_pairs(%__MODULE__{fields: fields}, false) do
for {k, %FieldDefinition{default: default}} <- fields, do: {k, default}
end
def default_pairs(%__MODULE__{fields: fields}, true) do
for {k, %FieldDefinition{default: default}} <- fields, default != :__undef__, do: {k, default}
end
end