defmodule MastodonClient do @moduledoc """ HTTP client for Mastodon and Pleroma based on `Tesla`. All HTTP functions take a `t:MastodonClient.Conn.t/0` struct and return a `t:Tesla.Env.result/0`. ```elixir %MastodonClient{ instance: "https://gleasonator.com", access_token: "OkgdLaYHU8A6Dc70eW7gSfBQzPFpwWI6UfHg2F2zQdM" } |> MastodonClient.get("/api/v1/instance") ``` """ alias MastodonClient.Conn @doc """ Build a Tesla client for use with Tesla HTTP functions. You usually shouldn't need to call this function directly. Prefer to use `get/3`, `post/4`, etc. ```elixir conn = %MastodonClient.Conn{instance: "https://gleasonator.com"} client = MastodonClient.new(conn) Tesla.get(client, "/api/v1/instance") ``` """ @spec new(Conn.t()) :: Tesla.Client.t() def new(%Conn{} = conn) do middleware = [ {Tesla.Middleware.Headers, [{"Content-Type", "application/json"}]}, {Tesla.Middleware.BaseUrl, conn.instance}, Tesla.Middleware.JSON ] middleware = if conn.access_token do [ {Tesla.Middleware.Headers, [{"Authorization", "Bearer #{conn.access_token}"}]} | middleware ] else middleware end Tesla.client(middleware) end def get(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.get(client, url, opts) end def get!(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.get!(client, url, opts) end def delete(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.delete(client, url, opts) end def delete!(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.delete!(client, url, opts) end def head(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.head(client, url, opts) end def head!(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.head!(client, url, opts) end def options(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.options(client, url, opts) end def options!(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.options!(client, url, opts) end def trace(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.trace(client, url, opts) end def trace!(%Conn{} = conn, url, opts \\ []) do client = new(conn) Tesla.trace!(client, url, opts) end def patch(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.patch(client, url, body, opts) end def patch!(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.patch!(client, url, body, opts) end def post(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.post(client, url, body, opts) end def post!(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.post!(client, url, body, opts) end def put(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.put(client, url, body, opts) end def put!(%Conn{} = conn, url, body, opts \\ []) do client = new(conn) Tesla.put!(client, url, body, opts) end def request(%Conn{} = conn, opts \\ []) do client = new(conn) Tesla.request(client, opts) end def request!(%Conn{} = conn, opts \\ []) do client = new(conn) Tesla.request!(client, opts) end end