lib/fussy/constructors.ex

defmodule Fussy.Constructors do
  alias Fussy.Validators

  defdelegate integer(args \\ []), to: Validators.Integer, as: :new

  def non_neg_integer(args \\ []) do
    args
    |> Keyword.merge(gte: 0)
    |> integer()
  end

  def pos_integer(args \\ []) do
    args
    |> Keyword.merge(gte: 1)
    |> integer()
  end

  defdelegate float(args \\ []), to: Validators.Float, as: :new

  def non_neg_float(args \\ []) do
    args
    |> Keyword.merge(gte: 0.0)
    |> float()
  end

  defdelegate string(args \\ []), to: Validators.String, as: :new

  def non_empty_string(args \\ []) do
    string(Keyword.merge(args, min_length: 1))
  end

  defdelegate optional(t), to: Validators.Optional, as: :new

  defdelegate boolean(args \\ []), to: Validators.Boolean, as: :new

  defdelegate list(t, args \\ []), to: Validators.List, as: :new

  def non_empty_list(t, args \\ []) do
    list(t, Keyword.merge(args, min_length: 1))
  end

  defdelegate either(variants), to: Validators.Either, as: :new

  defdelegate literal(literal), to: Validators.Literal, as: :new

  defdelegate atom(atom), to: Validators.Atom, as: :new

  def enum(atoms) when is_list(atoms) do
    atoms
    |> Enum.map(&atom/1)
    |> either()
  end

  defdelegate datetime(), to: Validators.DateTime, as: :new

  defdelegate any(), to: Validators.Any, as: :new

  defdelegate tuple(structure, args \\ []), to: Validators.Tuple, as: :new

  def map({key, value}) do
    Validators.Map.new(key, value)
  end

  defdelegate map(map, opts \\ []), to: Validators.FixedMap, as: :new

  defdelegate default(t, default), to: Validators.Default, as: :new
end