lib/kinda_codegen.ex

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

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

  @callback filter_functions(list(Kinda.CodeGen.Function.t())) :: list(Kinda.CodeGen.Function.t())
  def filter_functions(funcs), do: funcs

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

  @callback nif_gen(Kinda.CodeGen.Function.t()) :: Kinda.CodeGen.NIF.t()
  def nif_gen(f), do: Kinda.CodeGen.NIF.from_function(f)

  @callback kinds() :: Kinda.CodeGen.Type.t()
  def kinds(), do: []
end