I have a module with a function with two implementations using pattern matching:
def agent_registered(%Event{} = event) do
...
end
def agent_registered(agent_id) do
...
end
My application’s main module contains only defdelegate
s to a number of “implementation” modules.
Someone trying to call a function from the main module can use the auto-complete feature of iex
or the IDE to see the arguments it expects, which is nice. However, in the case of that agent_registered
function I can’t include two defdelegates
, one for each case, as it’s the same function:
This is “wrong” (a warning is displayed for the second line):
defdelegate agent_registered(event), to: AgentRegistered
defdelegate agent_registered(user_id), to: AgentRegistered
This is fine, but then the argument name must cater for all the possibilities:
defdelegate agent_registered(event_or_user_id), to: AgentRegistered
I tried adding @spec
to the actual function implementation informing the possible argument types but iex
and IDE keeps showing the argument name as in the defdelegate
.
Have you ever had to deal with such scenario? Should I simply have different functions for different arguments instead of pattern matching in this case? Should I go for def
instead of defdelegate
and bring the pattern matching to the main module?
Thanks!