defmodule Plausible.Billing.Ecto.Limit do @moduledoc """ Ecto type representing a limit, that can be either a number or unlimited. Unlimited is dumped to the database as `-1` and loaded as `:unlimited` to keep compatibility with the rest of the codebase. """ use Ecto.Type def type, do: :integer def cast(-1), do: {:ok, :unlimited} def cast(:unlimited), do: {:ok, :unlimited} def cast("unlimited"), do: {:ok, :unlimited} def cast(other), do: Ecto.Type.cast(:integer, other) def load(-1), do: {:ok, :unlimited} def load(other), do: Ecto.Type.load(:integer, other) def dump(:unlimited), do: {:ok, -1} def dump(other), do: Ecto.Type.dump(:integer, other) end