Packages

Elixir wrapper to consume randomuser.me API

Current section

Files

Jump to
randomuser_ex lib randomuser_ex.ex
Raw

lib/randomuser_ex.ex

defmodule RandomuserEx do
@moduledoc ~S"""
Elixir wrapper to consume randomuser.me API.
Just a simple wrapper for the randomuser.me API in order to make easy to get
information to create random users in our applications.
"""
alias RandomuserEx.{Id, Location, Login, Name, Picture, RandomUser}
@doc ~S"""
Fetch one random user generated by randomuser.me matching the options specified.
## Usage example
iex(1)> {:ok, user} = RandomuserEx.get_one(%{gender: :male})
iex(2)> !is_nil(user)
true
"""
def get_one(params \\ %{}) do
case get_many(params) do
{:ok, results} -> {:ok, List.first(results)}
{:error, reason} -> {:error, reason}
end
end
@doc ~S"""
Fetch N random users generated by randomuser.me matching the options specified.
## Usage example
iex(1)> {:ok, users} = RandomuserEx.get_many(%{nat: :es}, 20)
iex(2)> length(users)
20
iex(3)> !is_nil(Enum.at(users, 0))
true
"""
def get_many(params \\ %{}, number \\ 1) do
params =
params
|> Map.put(:results, number)
|> Map.put(:format, :json)
case fetch(params) do
{:ok, results} ->
users = Enum.map(results["results"], fn (result) ->
Poison.decode!(Poison.encode!(result), as: user_structure())
end)
{:ok, users}
{:error, reason} -> {:error, reason}
end
end
# Private functions
defp fetch(params) do
uri = "https://randomuser.me/api/?" <> URI.encode_query(params)
case HTTPoison.get(uri) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
case Poison.decode(body) do
{:ok, values} -> {:ok, values}
{:error, reason} -> {:error, reason}
end
_ -> {:error, nil}
end
end
defp user_structure do
%RandomUser{
id: %Id{}, location: %Location{}, login: %Login{},
name: %Name{}, picture: %Picture{}
}
end
end