TL;DR
A single element, in this case an integer
, is given to a Phoenix.Component
but a list of such elements should be given. Can a compile-time warning/error be produced by any tool?
I’ve made a repro project. The gist of it is that
-
A.Foo
returns an integer to -
AWeb.ALive
and it in turn (incorrectly) forwards this integer (rather than a list of integers) to -
AWeb.AComponent
.
#1
defmodule A.Foo do
@spec number() :: pos_integer()
def number() do
1729
end
end
#2
defmodule AWeb.ALive do
use AWeb, :live_view
def mount(_params, _session, socket) do
{:ok,
socket
|> assign(:number, A.Foo.number())}
end
def render(assigns) do
~H"""
<AWeb.AComponent.bar numbers={@number} /> # Should've been `[@number]`
"""
end
end
#3
defmodule AWeb.AComponent do
use Phoenix.Component
attr(:numbers, :list, required: true)
@spec bar(%{numbers: list(pos_integer)}) :: any
def bar(assigns) do
~H"""
<li :for={number <- @numbers}>
<%= number %>
</li>
"""
end
end
Can this be catched by the compiler, Dialyzer, anything? My understanding is “no”, but I hope I’m wrong:
-
attr
macro atm only does compile-time validation of literals - even
@spec
ing thePhoenix.Component
above with@spec bar(%{numbers: list(pos_integer)}) :: any
doesn’t help, asmix dialyzer
gives no warnings.
Is there any other tool that would help with this?