Current section
Files
Jump to
Current section
Files
lib/typeracer.ex
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