Packages

A GenServer-based fake phone number mapper

Current section

Files

Jump to
fakephone lib fakephone.ex
Raw

lib/fakephone.ex

defmodule Fakephone do
@moduledoc """
A GenServer fake phone number process.
"""
use GenServer
# Client API
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
def init(_opts) do
{:ok, %{}}
end
# Server Callbacks
def get_new_phone(phone) do
GenServer.call(__MODULE__, {:get_new_phone, phone})
end
def get_current_phone(phone) do
GenServer.call(__MODULE__, {:get_current_phone, phone})
end
def get_real_phone_by_fake_number(phone) do
GenServer.call(__MODULE__, {:get_real_phone, phone})
end
def get_fake_phone_by_real_phone(phone) do
GenServer.call(__MODULE__, {:get_fake_phone, phone})
end
# Callbacks
def handle_call({:get_new_phone, phone_number}, _from, state) do
new_number = generate_random_phone_number()
updated_state = Map.put(state, phone_number, new_number)
{:reply, new_number, updated_state}
end
def handle_call({:get_current_phone, phone_number}, _from, state) do
fake_number = Map.get(state, phone_number, generate_random_phone_number())
new_state = Map.put(state, phone_number, fake_number)
{:reply, fake_number, new_state}
end
def handle_call({:get_fake_phone, real_number}, _from, state) do
fake_number = Map.get(state, real_number, generate_random_phone_number())
new_state = Map.put(state, real_number, fake_number)
{:reply, fake_number, new_state}
end
def handle_call({:get_real_phone, fake_number}, _from, state) do
real_number = filter_by_value(state, fake_number)
{:reply, real_number, state}
end
# Helpers
defp generate_random_phone_number do
country_code = "52"
area_code = "55"
remaining_digits = Enum.join(Enum.map(1..7, fn _ -> Integer.to_string(Enum.random(0..9)) end))
phone_number = "#{country_code}#{area_code}#{remaining_digits}"
phone_number
end
defp filter_by_value(map, fake_number) do
map
|> Enum.filter(fn {_key, value} -> value == fake_number end)
|> Enum.map(fn {key, _value} -> key end)
|> case do
[] -> fake_number
[key] -> key
end
end
end