defmodule XRPC do @moduledoc """ `XRPC` client implementation (https://atproto.com/specs/xrpc) """ @http_client XRPC.HTTP.Req def query(client, id, opts \\ []) do opts = put_auth_header(opts, client.access_token) get(url(client.host, id), opts) end def procedure(client, id, opts \\ []) do opts = opts |> put_auth_header(client.access_token) |> put_content_type_header() post(url(client.host, id), opts) end defp url(service, id), do: "#{service}" <> "/xrpc" <> "/#{id}" defp get(url, opts), do: @http_client.get(url, opts) defp post(url, opts), do: @http_client.post(url, opts) defp put_auth_header(opts, access_token) do put_headers(opts, authorization: "Bearer #{access_token}") end defp put_content_type_header(opts) do put_headers(opts, content_type: "application/json") end defp put_headers(opts, headers) do opts |> Keyword.put_new(:headers, []) |> Keyword.update(:headers, [], &Keyword.merge(&1, headers)) end end