Current section

Files

Jump to
argx lib converter.ex
Raw

lib/converter.ex

defmodule Argx.Converter do
@moduledoc false
def convert([_ | _] = args_kw, [_ | _] = configs, m) do
do_convert(args_kw, configs, m, [])
end
defp do_convert([], [], _, acc) do
acc |> Enum.reverse()
end
defp do_convert(
[{k1, v1} | rest1],
[{k2, %Argx.Config{auto: true, type: type}} | rest2],
m,
acc
)
when k1 == k2 and not is_nil(v1) do
v1 = to_type(v1, type)
do_convert(rest1, rest2, m, [{k1, v1} | acc])
end
defp do_convert(
[{k1, _} = kv | rest1],
[{k2, _} | rest2],
m,
acc
)
when k1 == k2 do
do_convert(rest1, rest2, m, [kv | acc])
end
defp to_type(value, :integer) when is_bitstring(value) do
try do
String.to_integer(value)
rescue
ArgumentError -> value
end
end
defp to_type(value, :integer) when is_integer(value) do
value
end
defp to_type(value, :float) when is_bitstring(value) do
try do
String.to_float(value)
rescue
ArgumentError -> value
end
end
defp to_type(value, :float) when is_float(value) do
value
end
defp to_type(value, :float) when is_integer(value) do
value / 1.0
end
defp to_type(value, _) do
value
end
end