defmodule Typeracer do alias Typeracer.User @endpoint "https://typeracerdata.appspot.com/users" @moduledoc "Typeracer API wrapper" @doc ~s[ This function is used to fetch user's statistics from the API. ##Examples iex> {:ok, user} = Typeracer.get_user("typeracer") iex> user.id "tr:typeracer" ] @spec get_user(id :: String.t) :: {:ok, user :: %User{}} | {:error, :id_not_found} | {:error, {:invalid_json, term}} | {:error , term} def get_user(id, http_lib \\ HTTPoison) do id |> user_query_url |> http_lib.get |> handle_request end defp user_query_url(id), do: (@endpoint <> "?id=tr:" <> id) defp handle_request({:ok, %{status_code: 404}}) do {:error, :id_not_found} end defp handle_request({:ok, %{status_code: 200, body: body}}) do body |> Poison.decode |> parse_body end defp handle_request(error), do: error defp parse_body({:ok, map}), do: User.from_api_map(map) defp parse_body(error), do: {:error, {:invalid_json, error}} end