lib/baz/ecto_types/strings.ex

defmodule Baz.EctoTypes.Strings do
  use Ecto.Type
  require Logger

  def type, do: {:array, :string}

  def cast(nil), do: {:ok, nil}

  def cast(str) when is_binary(str) do
    str
    |> String.replace(~r/\s/, "")
    |> String.split(",")
    |> cast
  end

  def cast(arr) when is_list(arr) do
    arr
    |> Enum.reduce(
      {:ok, []},
      fn
        "", acc ->
          acc

        v, {:ok, values} when is_integer(v) ->
          {:ok, values ++ [Integer.to_string(v)]}

        v, {:ok, values} when is_binary(v) ->
          {:ok, values ++ [v]}

        _, :error ->
          :error

        _, _ ->
          :error
      end
    )
  end

  def cast(_), do: :error

  def load(val) when is_list(val), do: {:ok, val}
  def load(_), do: :error

  def dump(val) when is_list(val), do: {:ok, val}
  def dump(_), do: :error
end