lib/xapi/phx.ex

defmodule Xmeta.Xapi.Phx do
  
  use Phoenix.Controller,formats: [:html, :json]
  import Plug.Conn

  def call_api(conn, params) do
    site = module_name_upcase(params["xapi_site"])
    router = module_name_upcase(params["xapi_router"])
    view = module_name_upcase(params["xapi_view"])
    mod =
      Module.concat(["Xapi", site, router, view])
    apply(mod, :call, [conn, format_params(conn.params)])
  end

  defp format_params(params) do
    params 
      |> Map.delete("glob") 
      |>Map.delete("xapi_site") 
      |>Map.delete("xapi_router") 
      |>Map.delete("xapi_view") 
  end

  defp module_name_upcase(name) do
    {first,last} = String.next_grapheme(name)  
    String.upcase(first) <> last
  end

  def controller(conn, params) do
    rsp = Xmeta.Xapi.Phx.call_api(conn,params)
    json(conn,rsp)
  end
  
  defmacro init_api(path) do
    quote do
      scope unquote(path) do
        get "/:xapi_site/:xapi_router/:xapi_view", Xmeta.Xapi.Phx, :controller
        post "/:xapi_site/:xapi_router/:xapi_view", Xmeta.Xapi.Phx, :controller
        forward "/docs", Xmeta.Xapi.Docs.Plug
      end
    end
  end
end