lib/ex_teal/resource/repo.ex

defmodule ExTeal.Resource.Repo do
  @doc """
  Defines the module `use`-ing `Ecto.Repo` to be used by the resource.

  Defaults to the value set in config if present:

      config :ex_teal,
         repo: MyApp.Repo

  Default can be overridden per resource:

      def repo, do: MyApp.SecondaryRepo

  """
  @callback repo() :: module
  defmacro __using__(_opts) do
    quote do
      unless ExTeal.Resource.Repo in @behaviour do
        @behaviour ExTeal.Resource.Repo
        unquote(default_repo())
      end
    end
  end

  @doc false
  def default_repo do
    quote do
      def repo, do: Application.fetch_env!(:ex_teal, :repo)
      defoverridable repo: 0
    end
  end
end