defmodule Zig.Type.Enum do use Zig.Type defstruct [:tags, :name] @type t :: %__MODULE__{tags: %{optional(atom) => String.t()}, name: String.t()} def from_json(%{"tags" => tags, "name" => name}, module) do %__MODULE__{ tags: Map.new(tags, fn {key, val} -> {String.to_atom(key), val} end), name: String.trim_leading(name, ".#{module}.") } end def to_string(enum), do: enum.name def to_call(enum), do: "nif." <> enum.name def inspect(enum, opts) do ~s(%Zig.Type.Enum{name: "#{enum.name}", tags: #{Kernel.inspect(enum.tags, opts)}}) end def return_allowed?(_), do: true def spec(%{tags: tags}, _, _opts) do tags |> Map.keys() |> Enum.sort() |> Enum.reverse() |> Enum.reduce(fn a, b -> quote do unquote(a) | unquote(b) end end) end end