lib/kinda_codegen.ex

defmodule Kinda.CodeGen do
  @moduledoc """
  Behavior for customizing your source code generation.
  """

  alias Kinda.CodeGen.{KindDecl, NIFDecl}

  defmacro __using__(_) do
    quote do
      @behaviour Kinda.CodeGen
    end
  end

  @callback type_gen(atom(), String.t()) :: {:ok, KindDecl.t()} | :skip

  @callback nif_gen(any()) :: NIFDecl.t()
  def nif_gen(f), do: NIFDecl.from_function(f)

  @callback kinds() :: KindDecl.t()
  def kinds(), do: []
end