Как и @mudasobwa, я бы делал извлечение данных в get_public_request
, но с одним из этих двух других синтаксисов:
сопоставление с образцом на карте
def get_prices(item), do:
%{"buy":var1, "sell": var2} = item_path(item) |> get_public_request do
def get_public_request(url) do
HTTPoison.start
case HTTPoison.get(url) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
Poison.decode!(body)["item"] |> Map.take(["buy", "sell"])
...
end
end
Примечание: это решение будет аварийно завершено во время сопоставления с образцом, если отсутствует одно из двух полей «купить» или «продать». вы можете избежать этого, используя case
.
сопоставление с образцом на кортеже
def get_prices(item), do: {var1, var2} = item_path(item) |> get_public_request
def get_public_request(url) do
HTTPoison.start
case HTTPoison.get(url) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
Poison.decode!(body)["item"] |> (&({&1["buy"],&1["sell"]}).()
...
end
end
если вы хотите обработать случай, когда в поле есть данные или нет, вы можете добавить следующую проверку:
Poison.decode!(body)["item"] |> (&({Map.has_key?(&1,"buy") && &1["buy"] || nil, Map.has_key?(&1,"sell") && &1["sell"] || nil}).()