Current section

Files

Jump to
random_user_api lib RandomUserApi engine.ex
Raw

lib/RandomUserApi/engine.ex

defmodule RandomUserApi.Engine do
@random_me_url "http://api.randomuser.me"
@doc """
Function that generates n number of random users.
Return list of maps with the users.
## Parameters
- number: integer that represents number of of required random users.
- gender: atom, :male or :female. If something different is passed, it won't be applied.
- nat: list of nationalities, comma-separated. In handles only known nationalities by the API.
"""
def get_users(number, gender, nat \\ []) do
url = @random_me_url <> "?results=#{number}"
url = if _validate_gender(gender), do: url <> "&gender=#{gender}", else: url
nat = _validate_nat(nat)
url = if nat != "", do: url <> "&nat=#{nat}", else: url
url
|> _fetch_url
|> _process
end
defp _random_user_api do
Application.get_env(:random_user_api, :random_me_api)
end
defp _validate_gender(gender) do
case gender do
:female -> :female
:male -> :male
_ -> nil
end
end
defp _validate_nat(nat) when is_list(nat) do
nats = ~w(AU BR CA CH DE DK ES FI FR GB IE IR NL NZ TR US)
nat
|> Enum.filter(&(&1 in nats))
|> Enum.join(",")
end
defp _validate_nat(_nat) do
""
end
defp _process(input) do
input
|> _to_json
|> _get_from_results
end
defp _fetch_url(url) do
result = _random_user_api.get url
case result do
%{body: data} -> data
%{message: _} -> :error
end
end
defp _to_json(:error) do
"An error occured. Please try again later."
end
defp _to_json(data) do
:jsx.decode data
end
defp _get_from_results(str) when is_bitstring(str) do
str
end
defp _get_from_results(json) do
{_results, data} = json
|> hd
for user <- data, do: Enum.into(user, %{})
end
end