Awlexus
Warning about missing pattern match, despite pattern matching
I’m getting the following warning when compiling my project and I’m not sure how to resolve it, because from what I see there is a proper pattern match
Warning
warning: a struct for Plug.Upload is expected on struct update:
%Plug.Upload{image | filename: random_filename(name)}
but got type:
dynamic()
where "image" was given the type:
# type: dynamic()
# from: my_file.ex:95:79
%{"image" => %Plug.Upload{filename: name} = image} = params
when defining the variable "image", you must also pattern match on "%Plug.Upload{}".
hint: given pattern matching is enough to catch typing errors, you may optionally convert the struct update into a map update. For example, instead of:
user = some_function()
%User{user | name: "John Doe"}
it is enough to write:
%User{} = user = some_function()
%{user | name: "John Doe"}
typing violation found at:
│
96 │ image = %Plug.Upload{image | filename: random_filename(name)}
│ ~
│
└─ my_file.ex:96:13: MyModule.put_random_filename/1
Code
defp put_random_filename(%{"image" => %Plug.Upload{filename: name} = image} = params) do
image = %Plug.Upload{image | filename: random_filename(name)}
%{params | "image" => image}
end
defp put_random_filename(params), do: params
Elixir -v
Erlang/OTP 28 [erts-16.1.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [jit]
Elixir 1.19.2 (compiled with Erlang/OTP 28)
Different variations that trigger the same warning
No match against file name
defp put_random_filename(%{"image" => %Plug.Upload{} = image} = params) do
image = %Plug.Upload{image | filename: random_filename(image.filename)}
%{params | "image" => image}
end
Flipping the assignment
defp put_random_filename(%{"image" => image = %Plug.Upload{filename: name}} = params) do
image = %Plug.Upload{image | filename: random_filename(name)}
%{params | "image" => image}
end
Marked As Solved
sabiwara
This actually looks like a bug (or limitation) when inferring non-atom map keys.
I opened an issue Structs nested in domain-key maps are not inferred · Issue #14915 · elixir-lang/elixir · GitHub.
Also Liked
a-maze-d
image = %Plug.Upload{image | filename: random_filename(name)}
What about rewiting this to:
image = %{image | filename: random_filename(name)}
garrison
Surely this is a bug? The struct is clearly typed. Maybe someone with more knowledge will reply, but I would say file an issue.
Does this infer properly?
def foo(%{"image" => image}) do
%Plug.Upload{} = image
%Plug.Upload{image | filename: "foo"}
end
Awlexus
I’ve tried these 2 variations. Both trigger the warning
defp put_random_filename(%{"image" => image} = params) do
%Plug.Upload{filename: name} = image
image = %Plug.Upload{image | filename: random_filename(name)}
%{params | "image" => image}
end
defp put_random_filename(%{"image" => image} = params) do
%Plug.Upload{} = image
image = %Plug.Upload{image | filename: random_filename(image.filename)}
%{params | "image" => image}
end
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










