Packages
A bare bones interface for the Pokemon API. It can get selected information for a pokemon by name, as well as the complete list of pokemons. This is a student project to learn about caching, ETS, GenServers, supervisors, mix, APIs, hex, git, documentation, testing, and patience.
Current section
Files
Jump to
Current section
Files
lib/pokelixir_cache.ex
defmodule PokelixirCache do
@moduledoc """
This module is the first one to be initialized by the Pokelixir Application.app()
The Supervision Tree starts the caching features of the app
In this version, only pokemon structs are cached. Code is prepared to scale to handle caching of abilities and types.
"""
use GenServer
@table_pokemons :pokemon_cache
# @table_abilities :abilities_cache
@spec start_link(any) :: :ignore | {:error, any} | {:ok, pid}
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: :pokelixir_cache)
end
@impl true
@spec init(any) :: {:ok, any}
def init(init_arg) do
PokelixirCache.cache_init()
{:ok, init_arg}
end
@doc """
Create a new ETS Cache if it doesn't already exists
:ets.new(@table_abilities, [:set, :public, :named_table]) - Future implementation of abilities cache
"""
@spec cache_init :: atom | :ets.tid()
def cache_init do
:ets.new(@table_pokemons, [:set, :public, :named_table])
rescue
ArgumentError -> {:error, :already_started}
end
@doc """
Inserts a pokemon in the cache
"""
def put(pokemon) do
GenServer.cast(:pokelixir_cache, {:put, pokemon})
end
@doc """
Retreive a value back from cache
"""
def get(name) do
GenServer.call(:pokelixir_cache, {:get, name})
end
@impl true
def handle_cast({:put, pokemon}, _state) do
IO.inspect(pokemon, label: "ETS PUT")
true = :ets.insert(@table_pokemons, {pokemon.name, pokemon})
{:noreply, :ok}
end
@impl true
def handle_call({:get, name}, _from, _state) do
IO.inspect(:ets.lookup(@table_pokemons, name), label: "ETS GET #{name}")
case :ets.lookup(@table_pokemons, name) do
[{^name, pokemon}] -> {:reply, pokemon, :ok}
_else -> {:reply, nil, :ok}
end
end
end