3

我正在尝试在 elixir 中编写一个宏,该宏创建一个 Phoenix 路由器和一个控制器,该控制器具有一个应该向调用者进程发送消息的操作(从测试中调用它)。

这是对宏的调用:

start_server self(), "TestService", 8080, "/some_action", fn(conn, _) ->
  conn |> text("")
end

问题是我从测试中通过的 pid 在操作中没有保留。Line#1打印正确的 pid,line#2打印错误的 pid。我很确定我错过了一些关于quote/的东西unquote,但我找不到我做错了什么?

这是宏定义:

defmacro start_server pid, name, port, path, handler do
  controller_name = String.to_atom("#{name}Controller")
  router_name = String.to_atom("#{name}Router")
  quote do
    IO.inspect(unquote(pid))                              # 1
    ctrl = defmodule unquote(controller_name) do
      use Phoenix.Controller

      def handle conn, msg do
        IO.inspect(unquote(pid))                          # 2
        send unquote(pid), {:request, unquote(path), unquote(name)}
        unquote(handler).(conn, msg)
      end
    end

    IO.inspect ctrl

    router = defmodule unquote(router_name) do
      use Phoenix.Router

      post unquote(path), unquote(controller_name), :handle
    end
    Application.put_env(:phoenix, unquote(router_name),
      port: unquote(port),
      debug_errors: true
    )
    IO.inspect router
    {:ok, pid} = unquote(router_name).start()
  end
end
4

0 回答 0