defmodule Typeracer do @endpoint "https://typeracerdata.appspot.com/users" def get_user(id, http_lib \\ HTTPoison) do case id |> user_query_url |> http_lib.get do {:ok, %{status_code: 404}} -> {:error, :id_not_found} {:ok, response = %{status_code: 200}} -> decode(response) error -> error end end defp decode(response) do case Poison.decode(response.body) do {:ok, map} -> to_user(map) error -> error end end defp to_user(map = %{ "tstats" => %{ "bestGameWpm" => best_game_wpm, "cg" => completed_games, "gamesWon" => games_won, "level" => level, "recentAvgWpm" => recent_avg_wpm, "recentScores" => recent_scores, "wpm" => wpm } }) do user = %Typeracer.User{ id: map["id"], name: map["name"], last_name: map["lastName"], country: map["country"], level: level, best_game_wpm: best_game_wpm, completed_games: completed_games, games_won: games_won, recent_avg_wpm: recent_avg_wpm, recent_scores: recent_scores, wpm: wpm } {:ok, user} end defp to_user(_) do {:error, "Unrecognized response"} end defp user_query_url(id) do @endpoint <> "?id=tr:" <> id end end