lib/zig/type/optional.ex

defmodule Zig.Type.Optional do
  alias Zig.Type
  use Type

  defstruct [:child]

  @type t :: %__MODULE__{child: Type.t()}

  def from_json(%{"child" => child}, module),
    do: %__MODULE__{child: Type.from_json(child, module)}

  def to_string(optional), do: "?#{Kernel.to_string(optional.child)}"

  def to_call(optional), do: "?#{Type.to_call(optional.child)}"

  def return_allowed?(optional), do: Type.return_allowed?(optional.child)

  def spec(%{child: child}, context, opts) do
    quote do
      unquote(Type.spec(child, context, opts)) | nil
    end
  end

  def of(child), do: %__MODULE__{child: child}
end