defmodule Exkad.Backends.HTTP.Client do alias Exkad.Node.Descriptor, as: ND defmodule Client do use HTTPotion.Base end defp headers(%ND{id: id, loc: loc}) do ["fromloc": loc, "fromid": id] end defp transfer_headers do ["Content-Type": "application/json"] end defp un_json("ok"), do: :ok defp un_json(%{"ok" => res}) do {:ok, res} end defp un_json(%{"value" => %{"ok" => payload}}) do {:value, {:ok, payload}} end defp un_json(js), do: js defp from_json(%HTTPotion.Response{body: body} = response) do Poison.decode!(body) |> un_json end def dump(_), do: raise :not_implemented def describe(_), do: raise :not_implemented def rput(_, _, _), do: raise :not_implemented def rget(_, _), do: raise :not_implemented def ping(%ND{loc: server}, from_desc) do Client.start url = server <> "/ping" Client.get(url, headers(from_desc)) |> from_json end def find(%ND{loc: server}, id, from_desc) do Client.start url = server <> "/find/#{id}" Client.get(url, headers(from_desc)) |> (fn res -> res.body end).() |> Poison.decode!(as: %{"ok" => [ND]}) |> un_json end def put(%ND{loc: server}, value) do Client.start url = server <> "/item" Client.put(url, value, transfer_headers) |> from_json end def put_meta(%ND{loc: server}, term, ptr) do Client.start url = server <> "/item/#{ptr}/meta" Client.put(url, term, transfer_headers) |> from_json end def search(%ND{loc: server}, key) do Client.start url = server <> "/search/#{key}" Client.get(url) |> from_json end def get(%ND{loc: server}, key) do Client.start url = server <> "/item/#{key}" case Client.get(url) |> from_json do {:value, {:ok, value}} -> {:value, {:ok, value}} err -> err end end end