I am a newbie to Elixir so please forgive any foolishness.
I have an ‘outer’ function called foo that needs to provide two main variants, that I want to be selected using a single-entry Keyword list, e.g. do_it: :one, or do_it: :two, with :two being the default case.
The two variants are such that one is a trivial extension of the other, so that the extended form can call the non-extended form, after performing a small amount of pre-processing on the input argument.
I have attempted to implement this behaviour as follows:
# the extended case, indicated by the option: keyword
def foo(value, do_it: :one) do
# do some pre-processing
# then call the 'core' processing, with no keyword
foo(val)
end
# the non-extended case, called by the extended case, keyword defaults to nil
def foo(value, _opt \\ nil) do
# do the main work
end
# the 'parent' case, which may optionally be passed the do_it: keyword pair
def bar(value, opt \\ nil) do
case foo(value, opt) do
case1 -> ...
case2 -> ...
end
end
# a typical call, invoking the extended case
bar(my_value, do_it: :one)
Unfortunately, when I use this approach, I get the following compiler warning.
warning: def foo/2 has multiple clauses and also declares default values. In such cases, the default values should be defined in a header. Instead of:
def foo(:first_clause, b \\ :default) do ... end
def foo(:second_clause, b) do ... end
one should write:
def foo(a, b \\ :default)
def foo(:first_clause, b) do ... end
def foo(:second_clause, b) do ... end
Now, I am sure that this explanation is meant to clarify things, but to me it is just
adding confusion. I realise it’s a big ask, but could somebody sugest how my code should
be structured to avoid this warning? The suggested improvment just doesn’t make
sense to me - e.g. what are :first_clause and :second_clause??