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