Current section

Files

Jump to
argx lib defaulter.ex
Raw

lib/defaulter.ex

defmodule Argx.Defaulter do
@moduledoc false
import Argx.Util
def set_default([_ | _] = args_kw, [_ | _] = configs, m) do
do_set_default(args_kw, configs, m, [])
end
defp do_set_default([], [], _, acc) do
acc |> Enum.reverse()
end
defp do_set_default(
[{k1, nil} | rest1],
[{k2, %Argx.Config{default: default}} | rest2],
m,
acc
)
when k1 == k2 and not is_nil(default) do
default = get_default(default, m)
do_set_default(rest1, rest2, m, [{k1, default} | acc])
end
defp do_set_default(
[{k1, _} = kv | rest1],
[{k2, _} | rest2],
m,
acc
)
when k1 == k2 do
do_set_default(rest1, rest2, m, [kv | acc])
end
defp get_default({{:., _, [{:__aliases__, _, [_ | _] = m}, f]}, _, a}, _) do
m
|> make_module_name()
|> apply(f, a)
end
defp get_default({f, _, a}, m) do
apply(m, f, a)
end
defp get_default(value, _) do
value
end
end