While Map.fetch!/2 is a viable option for simple cases, consider:
def some_fun(map) do
with \
{:ok, param1} <- wrap(map, :param1),
{:ok, param2} <- wrap(map, :param2),
...,
{:ok, paramN} <- wrap(map, :paramN)
do
...
end
...
end
def wrap(map, param) do
case Map.get(map, param) do
nil -> {:error, :badarg}
val -> {:ok, val}
end
end
If we wanted to get rid of the wrapper, we could do:
def some_fun(map) do
with \
p1 when not is_nil(p1) <- Map.get(map, :param1),
p2 when not is_nil(p2) <- Map.get(map, :param2),
...,
pN when not is_nil(pN) <- Map.get(map, :paramN)
do
...
else
nil -> {:error, :badarg}
end
...
end
But wouldn’t it be nice to be able to do:
def some_fun(map) do
with \
required(p1) <- Map.get(map, :param1),
required(p2) <- Map.get(map, :param2),
...,
required(pN) <- Map.get(map, :paramN)
do
...
else
nil -> {:error, :badarg}
end
...
end
Maybe there is a way to come up with such a required/1
macro that would only add a single when
guard to the AST?