Packages
ex_money
0.5.3
6.1.1
6.1.0
6.0.0
6.0.0-rc.0
5.24.2
5.24.1
5.24.0
retired
5.23.0
5.22.0
5.21.0
5.20.0
5.19.2
5.19.1
5.19.0
5.18.0
5.17.2
5.17.1
5.17.0
5.16.1
5.16.0
5.15.4
5.15.3
5.15.2
5.15.1
5.15.0
5.14.1
5.13.0
5.12.4
5.12.3
5.12.2
5.12.1
5.12.0
5.11.0
5.10.0
5.9.0
5.8.0
5.7.4
5.7.3
5.7.2
5.7.1
5.7.0
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.1
5.4.0
5.4.0-rc.0
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.0
5.0.2
5.0.1
5.0.0
retired
4.4.3
4.4.2
retired
4.4.1
4.4.0
4.3.0
4.2.2
4.2.1
4.2.0
4.1.0
4.0.0
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.1
3.3.0
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.0.0
2.12.2
2.12.1
retired
2.12.0
retired
2.11.0
2.10.0
2.9.1
2.9.0
2.8.0
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.0
2.3.0
2.2.2
2.2.1
2.2.0
2.1.0
2.1.0-rc.1
retired
2.1.0-rc.0
retired
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.3
1.1.2
1.1.1
retired
1.1.0
1.0.0
1.0.0-rc.0
retired
0.9.0
retired
0.8.5
retired
0.8.4
retired
0.8.3
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.0
retired
0.6.2
retired
0.6.1
retired
0.6.0
retired
0.5.3
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.3
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
retired
0.0.16
retired
0.0.15
retired
0.0.14
retired
0.0.13
retired
0.0.12
retired
0.0.11
retired
0.0.10
retired
0.0.9
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
0.0.2
retired
Money functions for operations on and localization of a money data type with support for ISO 4217 currencies and ISO 24165 digial tokens (crypto currencies).
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/money/exchange_rates/exchange_rates.ex
defmodule Money.ExchangeRates do @moduledoc """ Implements functions to retrieve exchange rates from Open Exchange Rates. An `app_id` is required and is configured in `config.exs` of the appropriate environment configuration file. The `app_id` can be configured as either a string or as a tuple `{:system, "shell variable name"}` to ease runtime retrieval of the `app_id`. ## Example configurations config :ex_money, open_exchange_rates_app_id: "app_id_string", open_exchange_rates_retrieve_every: 300_000 config :ex_money, open_exchange_rates_app_id: {:system, "OPEN_EXCHANGE_RATES_APP_ID"}, open_exchange_rates_retrieve_every: 300_000 """ @doc """ Defines the behaviour to retrieve exchange rates from an external data source """ @callback get_latest_rates() :: {:ok, %{}} | {:error, binary} require Logger # Defines the configuration for the exchange rates mechanism. defmodule Config do defstruct retrieve_every: nil, callback_module: nil, log_levels: %{}, delay_before_first_retrieval: nil end @default_retrieval_interval 300_000 @default_delay_before_first_retrieval 100 @default_callback_module Money.ExchangeRates.Callback @default_api_module Money.ExchangeRates.OpenExchangeRates @doc """ Returns the configuration for the exchange rates retriever. """ def config do %Config{ retrieve_every: Money.get_env(:exchange_rates_retrieve_every, @default_retrieval_interval), callback_module: Money.get_env(:callback_module, @default_callback_module), delay_before_first_retrieval: Money.get_env(:delay_before_first_retrieval, @default_delay_before_first_retrieval), log_levels: %{ success: Money.get_env(:log_success, nil), info: Money.get_env(:log_info, :warn), failure: Money.get_env(:log_failure, :warn) } } end @doc """ Forces retrieval of exchange rates Sends a message ot the exchange rate retrieval worker to request rates be retrieved. This function does not return exchange rates, for that see `Money.ExchangeRates.latest_rates/0`. """ def retrieve() do case Process.whereis(Money.ExchangeRates.Retriever) do nil -> {:error, {Money.ExchangeRateError, "Exchange rate service does not appear to be running"}} pid -> Process.send(pid, :latest, []) end end @doc """ Return the latest exchange rates. Returns: * `{:ok, rates}` if exchange rates are successfully retrieved. `rates` is a map of exchange rate converstion. * `{:error, reason}` if no exchange rates can be returned. """ @spec latest_rates() :: {:ok, Map.t} | {:error, {Exception.t, binary}} def latest_rates do try do case :ets.lookup(:exchange_rates, :rates) do [{:rates, rates}] -> {:ok, rates} [] -> {:error, {Money.ExchangeRateError, "No exchange rates were found"}} end rescue ArgumentError -> Logger.error "Argument error getting exchange rates from ETS table" {:error, {Money.ExchangeRateError, "No exchange rates are available"}} end end @doc """ Returns `true` if exchange rates are available and false otherwise. """ @spec rates_available?() :: boolean def rates_available? do case latest_rates() do {:ok, _} -> true {:error, _} -> false end end @doc """ Return the timestamp of the last successful retrieval of exchange rates or `{:error, reason}` if no timestamp is known. ## Example Money.ExchangeRates.last_updated #> {:ok, %DateTime{calendar: Calendar.ISO, day: 20, hour: 12, microsecond: {731942, 6}, minute: 36, month: 11, second: 6, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2016, zone_abbr: "UTC"}} """ @spec last_updated() :: {:ok, DateTime.t} | {:error, {Exception.t, binary}} def last_updated do case :ets.lookup(:exchange_rates, :last_updated) do [{:last_updated, timestamp}] -> {:ok, timestamp} [] -> Logger.error "Argument error getting last updated timestamp from ETS table" {:error, {Money.ExchangeRateError, "Last updated date is not known"}} end end @doc """ Retrieves exchange rates from the configured exchange rate api module. This call is the public api to retrieve results from an external api service or other mechanism implemented by an api module. This method is typically called periodically by `Money.ExchangeRates.Retriever.handle_info/2` but can called at any time by other functions. """ def get_latest_rates do Money.get_env(:api_module, @default_api_module).get_latest_rates() endend