defmodule Anilixir do @moduledoc """ Provides a simple interface to the Anilist API """ use Application alias Application, as: App alias Anilixir.Auth, as: Auth alias Anilixir.Request, as: Request alias Anilixir.Token, as: Token @doc false def start(_type, _args) do Token.start_link end @doc """ Provides Anilixir with authentication information to use. Must be called before using `Anilixir.get`. ## Examples Anilixir.config!("my_id", "my_secret") Or in `config/config.exs`: config :anilixir, id: "my_id" config :anilixir, secret: "my_secret" """ def config!(id, secret) do App.put_env(:anilixir, :id, id) App.put_env(:anilixir, :secret, secret) end @doc """ Makes Anilist queries and returns either an `{:ok, data}` or an `{:error, reason}` tuple. ## Examples Anilixir.get("user/1") """ def get(query) do token = Token.get case Request.make(token, query) do {:ok, data} -> {:ok, data} {:error, "Not authenticated"} -> authenticate_and_redo(query) {:error, message} -> {:error, message} end end defp authenticate_and_redo(query) do id = App.get_env(:anilixir, :id, "") secret = App.get_env(:anilixir, :secret, "") case Auth.get_token(id, secret) do {:ok, %{"access_token" => token}} -> Token.put(token) get(query) {:error, message} -> {:error, message} end end end