defmodule Fussy.Utils do
def validate_using(mod, data) when is_atom(mod), do: mod.validate(mod.validator(), [], data)
def validate_using(struct, data) when is_struct(struct),
do: struct.__struct__.validate(struct, [], data)
def validate_using(mod, path, data) when is_atom(mod),
do: mod.validate(mod.validator(), path, data)
def validate_using(struct, path, data) when is_struct(struct),
do: struct.__struct__.validate(struct, path, data)
def map_validator_from_fields(struct_fields) when is_map(struct_fields) do
{fields, aliases} =
struct_fields
|> Enum.reduce({%{}, %{}}, fn {key, %{validator: validator, opts: opts}},
{fields, aliases} ->
fields = Map.put(fields, key, validator)
case Keyword.get(opts, :alias) do
nil ->
{fields, aliases}
alias ->
{fields, Map.put(aliases, key, alias)}
end
end)
Fussy.Validators.FixedMap.new(fields, aliases: aliases)
end
end