defmodule Money.ExchangeRates.Cache do @moduledoc """ Defines a cache behaviour and default inplementation of a cache for exchange rates """ @doc """ Initialize the cache when the exchange rates retriever is started """ @callback init() :: any() @doc """ Terminate the cache when the retriver process stops normally """ @callback terminate() :: any() @doc """ Retrieve the latest exchange rates from the cache. """ @callback latest_rates() :: {:ok, map()} | {:error, {Exception.t(), String.t()}} @doc """ Returns the exchange rates for a given date. """ @callback historic_rates(Date.t()) :: {:ok, map()} | {:error, {Exception.t(), String.t()}} @doc """ Store the latest exchange rates in the cache. """ @callback store_latest_rates(map(), DateTime.t()) :: :ok @doc """ Store the historic exchange rates for a given date in the cache. """ @callback store_historic_rates(map(), Date.t()) :: :ok def latest_rates do cache().latest_rates end def historic_rates(date) do cache().historic_rates(date) end def cache do Money.ExchangeRates.Retriever.config().cache_module end end