Current section

Files

Jump to
lxd lib utils.ex
Raw

lib/utils.ex

defmodule LXD.Utils do
def arg(args, key, default \\ nil) do
case List.keyfind(args, key, 0, nil) do
{_, value } -> value
_ -> default
end
end
def handle_lxd_response(a, opts \\ [])
def handle_lxd_response({:ok, headers, body}, opts) do
fct = arg(opts, :fct, &default_apply_fct/1)
wait = arg(opts, :wait, true)
timeout = arg(opts, :timeout, 0)
{:ok, headers, body}
|> parse_body
|> 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}
{:error, r1, r2} ->
{:error, {r1, r2}}
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 default_apply_fct({:ok, _headers, body}) do
case is_map(body) do
true ->
case Map.fetch(body, "metadata") do
{:ok, value} -> {:ok, value}
:error -> {:ok, body}
end
false ->
{:ok, body}
end
end
end