The expressions you use in a with
construct do not have to contain the
<-
syntax. You can pattern match and bind values along the way as well.
with %{id: id} <- get_user(),
url = "/api/#{id}/blogs",
%{status_code: 200, body: body} <- HTTPoison.get(url),
{:ok, decoded_body} <- Poison.decode(body) do
{:ok, decoded_body}
end
In the above (sorta contrived) example we were able to construct a URL in the middle of the series of expressions.
The values we compute inline will be closed into the with
construct, so
they won't leak.
See the with
docs for more
details.