lib/custom_extension.ex

defmodule AshPostgres.CustomExtension do
  @moduledoc """
  A custom extension implementation.
  """

  @callback install(version :: integer) :: String.t()

  @callback uninstall(version :: integer) :: String.t()

  defmacro __using__(name: name, latest_version: latest_version) do
    quote do
      @behaviour AshPostgres.CustomExtension

      @extension_name unquote(name)
      @extension_latest_version unquote(latest_version)

      def extension, do: {@extension_name, @extension_latest_version, &install/1, &uninstall/1}
    end
  end
end