lib/athena_web/schema/scalar/date.ex

defmodule AthenaWeb.Schema.Scalar.Date do
  @moduledoc """
  Date Type for API
  """

  use Absinthe.Schema.Notation

  alias Absinthe.Blueprint.Input

  @desc """
  Date Generic Type

  Example: `2019-05-07`
  """
  scalar :date do
    parse &_parse/1
    serialize &_serialize/1
  end

  @spec _serialize(date :: Date.t()) :: String.t()
  defp _serialize(date), do: Date.to_iso8601(date)

  @spec _parse(input :: any) :: {:ok, Date.t()} | :error
  defp _parse(%Input.String{value: value}) do
    case Date.from_iso8601(value) do
      {:ok, date} ->
        {:ok, date}

      {:error, _} ->
        :error
    end
  end

  defp _parse(_other), do: :error
end