Current section
Files
Jump to
Current section
Files
lib/utils.ex
defmodule LXD.Utils do
def handle_lxd_response(a, opts \\ [])
def handle_lxd_response({:ok, headers, body}, opts) do
fct = arg(opts, :fct, fn({:ok, _h, b}) ->
case is_map(b) do
true ->
case Map.fetch(b, "metadata") do
{:ok, value} -> {:ok, value}
:error -> {:ok, b}
end
false ->
{:ok, b}
end
end)
wait = arg(opts, :wait, true)
timeout = arg(opts, :timeout, 0)
{:ok, headers, body}
|> parse_body
|> IO.inspect
|> wait_operation(wait, timeout)
|> apply_fct(fct)
end
def handle_lxd_response({:error, _} = o, _opts), do: o
defp parse_body({:ok, headers, body}) do
case Map.fetch(headers, "content-type") do
{:ok, value} ->
case value do
"application/json" ->
case Poison.decode(body) do
{:ok, value} ->
{:ok, headers, value}
{:error, reason} ->
{:error, reason}
end
_ ->
{:ok, headers, body}
end
:error ->
{:ok, headers, body}
end
end
defp parse_body({:error, _} = o), do: o
defp apply_fct({:ok, headers, body}, fct) do
fct.({:ok, headers, body})
end
defp apply_fct({:ok, body}, fct) do
fct.({:ok, %{}, body})
end
defp apply_fct({:error, _} = o, _fct), do: o
defp wait_operation(a, wait \\ true, timeout \\ nil)
defp wait_operation({:ok, headers, body}, wait, timeout) when wait == true and is_map(body) do
case Map.fetch(body, "operation") do
{:ok, value} ->
case String.length(value) do
0 ->
{:ok, headers, body}
_ ->
LXD.Operation.wait(value, timeout: timeout)
end
:error ->
{:ok, headers, body}
end
end
defp wait_operation(o, _, _), do: o
def arg(args, key, default \\ nil) do
case List.keyfind(args, key, 0, nil) do
{_, value } -> value
_ -> default
end
end
end