Packages
ex_money
0.1.7
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: 360_000
config :ex_money,
open_exchange_rates_app_id: {:system, "OPEN_EXCHANGE_RATES_APP_ID"},
open_exchange_rates_retrieve_every: 360_000
"""
@doc """
Defines the behaviour to retrieve exchange rates from an external
data source
"""
@callback get_latest_rates() :: {:ok, %{}} | {:error, binary}
# Defines the configuration for the exchange rates mechanism.
defmodule Config do
defstruct retrieve_every: nil, callback_module: nil, log_levels: %{}
end
@default_retrieval_interval 360_000
@default_callback_module Money.ExchangeRates.Callback
@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),
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 """
Return the latest exchange rates.
Returns:
* `{:ok, rates}` if exchange rates are successfully retrieved. `rates` is a map of
exchange rate converstion.
* `:error` if no exchange rates are available
"""
def latest_rates do
try do
case :ets.lookup(:exchange_rates, :rates) do
[{:rates, rates}] -> {:ok, rates}
[] -> {:error, "No exchange rates were found"}
end
rescue
ArgumentError -> {:error, "No exchange rates are available"}
end
end
@doc """
Return the timestamp of the last successful retrieval of exchange rates
##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"}}
"""
def last_updated do
case :ets.lookup(:exchange_rates, :last_updated) do
[{:last_updated, timestamp}] -> {:ok, timestamp}
[] -> :error
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, Money.ExchangeRates.OpenExchangeRates).get_latest_rates()
end
end