lib/zig/type/_function.ex

defmodule Zig.Type.Function do
  @moduledoc """
  module representing the zig type, as identified by performing semantic
  analysis on the zig code.
  """

  defstruct [:name, :arity, :params, :return]

  alias Zig.Type

  @type t :: %__MODULE__{
          name: atom(),
          arity: non_neg_integer(),
          params: [Type.t()],
          return: Type.t()
        }

  def from_json(%{"params" => params, "return" => return, "name" => name}, module) do
    params = Enum.map(params, &Type.from_json(&1, module))

    arity =
      case params do
        [:env | rest] -> length(rest)
        _ -> length(params)
      end

    %__MODULE__{
      name: String.to_atom(name),
      arity: arity,
      params: params,
      return: Type.from_json(return, module)
    }
  end
end