lib/extripe/actions/show.ex

defmodule Extripe.Actions.Show do
  alias Extripe.Utils.{API, Endpoint}

  defmacro __using__(opts) do
    {scope, opts} = Keyword.pop(opts, :scope)
    {singular, opts} = Keyword.pop(opts, :singular, false)
    resource = Keyword.fetch!(opts, :resource)

    has_scope_id = case scope do
      <<_scope::binary>> -> true
      {_scope, :singular} -> false
      nil -> false
    end

    cond do
      singular && !has_scope_id ->
        quote do
          @spec show() :: {:ok, map} | {:error, binary}
          def show do
            API.get(Endpoint.build(unquote(scope), nil, unquote(resource)))
          end
        end
      singular && has_scope_id ->
        quote do
          @spec show(binary) :: {:ok, map} | {:error, binary}
          def show(scope_id) do
            API.get(Endpoint.build(unquote(scope), scope_id, unquote(resource)))
          end
        end
      !has_scope_id ->
        quote do
          @spec show(binary) :: {:ok, map} | {:error, binary}
          def show(id) do
            API.get(Endpoint.build(unquote(scope), nil, unquote(resource), id))
          end
        end
       has_scope_id ->
        quote do
          @spec show(binary, binary) :: {:ok, map} | {:error, binary}
          def show(scope_id, id) do
            API.get(Endpoint.build(unquote(scope), scope_id, unquote(resource), id))
          end
        end
    end
  end
end