lib/xapi/docs/plug.ex

defmodule Xmeta.Xapi.Docs.Plug do
  use Plug.Router
  require EEx

  # if Mix.env() == :dev do
  #   use Plug.Debugger
  # end

  use Plug.ErrorHandler

  plug(Plug.Parsers,
    parsers: [:urlencoded, :json],
    json_decoder: Jason
  )

  plug(Plug.Logger, log: :debug)
  plug(:match)
  plug(:dispatch)

  @impl true
  def init(options) do
    # initialize options
    options
  end

  get "/" do
    render_html(conn, "home.html", amisJSON: Xmeta.Xapi.Docs.Amis.amisJSON())
    # send_resp(conn, 200, Xmeta.Docs.HomeTemplate.html())
  end

  match "/router/:mod/json" do    
    mod_name = conn.params["mod"]
    mod = mod_name |> String.split(".") |> Module.concat
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Jason.encode!(Xmeta.Xapi.Docs.Amis.get_router_view(mod)))
  end

  match "/view/:mod/json" do    
    mod_name = conn.params["mod"]
    mod = mod_name |> String.split(".") |> Module.concat
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Jason.encode!(Xmeta.Xapi.Docs.Amis.get_view(mod)))
  end


  match _ do
    send_resp(conn, 404, "not found")
  end

  defp render_html(%{status: status} = conn, template, assigns \\ []) do
    template_dir = __MODULE__.__info__(:compile)[:source] |> Path.dirname
    template_dir = template_dir
    body =
      template_dir
      |> Path.join(template)
      |> String.replace_suffix(".html", ".html.eex")
      |> EEx.eval_file(assigns)

    send_resp(conn, status || 200, body)
  end
end