lib/fussy/utils.ex

defmodule Fussy.Utils do
  def validate_using(mod, data) when is_atom(mod) do
    mod.validate(nil, data)
  end

  def validate_using(struct, data) when is_struct(struct) do
    struct.__struct__.validate(struct, data)
  end

  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