vic / params

Easy parameters validation/casting with Ecto.Schema, akin to Rails' strong parameters.
http://hex.pm/packages/params
Apache License 2.0
361 stars 46 forks source link

Compile error when using defparams macro in module that uses Phoenix.Component #45

Open mpinkston opened 9 months ago

mpinkston commented 9 months ago

Phoenix.Component overrides the def and defp macros to annotate function heads with some pattern matching. I believe because defparams creates a new method by calling Module.eval_quoted/2 this is somehow evaluating the ast returned by Phoenix.Component's def macro prematurely(? - tbh, I don't grok this perfectly yet)

But the error can be seen with code like the following:

defmodule MyMod do
  use Phoenix.Component
  use Params

  defparams fleeno %{some: :string}

  def hi do
    IO.puts("Hello")
  end
end
error: cannot invoke remote function Phoenix.Component.Declarative.__pattern__!/2 inside a match
  nofile:1: MyMod.util_2/1

Is there a reason I'm not understanding that the defparams macro is using Module.eval_quoted/2 rather than just defining the method directly?

In other words, can't

  Module.eval_quoted(__MODULE__, quote do
     def unquote(name)(params) do
       unquote(module_name).from(params)
     end
  end)

Just be written as

  def unquote(name)(params) do
    unquote(module_name).from(params)
  end

In my own experiments it seems to work fine, but I'm not sure if I'm missing something.

(Of course, I could just call the macro before I use Phoenix.Component, but perhaps there's a more comprehensive fix)