Convert Money Amounts between currencies. This library uses an OTP worker to save current conversion rates.
The package can be installed by adding currency_conversion to your list of dependencies in mix.exs:
def deps do
[
{:currency_conversion, "~> 1.0"},
{:jason, "~> 1.1"}, # When usig Fixer / Exchange Rates API,
{:httpotion, "~> 3.1"}, # When usig Fixer / Exchange Rates API
]
endCurrencyConversion is a wrapper around the currency conversion. We can define an
implementation as follows:
defmodule MyApp.CurrencyConversion do
use CurrencyConversion, otp_app: :my_app
endIf your application was generated with a supervisor (by passing --sup to mix new)
you will have a lib/my_app/application.ex file containing the application start
callback that defines and starts your supervisor. You just need to edit the start/2
function to start the converter as a supervisor on your application's supervisor:
def start(_type, _args) do
children = [
{MyApp.CurrencyConversion, []}
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)
endsource- Configure which Data Source Should Be Used.- Type:
atom - Default:
CurrencyConversion.Source.ExchangeRatesApi - Restrictions: Must implement
CurrencyConversion.Sourcebehaviour - Given Implementations:
CurrencyConversion.Source.Fixer- FixerCurrencyConversion.Source.ExchangeRatesApi- Exchange Rates APICurrencyConversion.Source.Test- Test Source
- Type:
base_currency- Change the base currency that is requested when fetching rates- Type:
atom - Default:
:EUR
- Type:
refresh_interval- Configure how often the data should be refreshed (in ms) or turn auto-refresh off.- Type:
integer | :manual - Default:
86_400_000(Once per Day) :manualturns auto-refresh off, do refresh yourself
- Type:
seed- Deliver the rates data manually.- Type:
(Keyword.t() -> {:ok, CurrencyConversion.Rates.t()} | {:error, binary}) | {module :: atom, function :: atom, arity :: 1} - Default: Load from
source
- Type:
test_rates- Configure rates forCurrencyConversion.Source.Testsource- Type:
{atom, %{atom: float}} - Default: see
CurrencyConversion.Source.Test.@default_rates - Example:
{:EUR, %{CHF: 7.0}}
- Type:
config :my_app, MyApp.CurrencyConversion,
source: CurrencyConversion.Source.Fixer,
source_api_key: "FIXER_ACCESS_KEY",
source_protocol: "https",
refresh_interval: 86_400_000A custom source can be implemented by using the behaviour CurrencyConversion.Source and reconfiguring the source config.
It only has to implement the function load/0, which produces a struct of type %CurrencyConversion.Rates{}.
To prevent HTTP calls in the Tests, configure the Test Source. (See the configuration test_rates for custom test rates.)
config :my_app, MyApp.CurrencyConversion,
source: CurrencyConversion.Source.Test,
refresh_interval: 86_400_000Only the callbacks from CurrencyConversion are exposed to the user. The library
money is used to represent money amounts.
Change 7 swiss franks to dollars:
iex> MyApp.CurrencyConversion.convert(Money.new(7_00, :CHF), :USD)
%Money{amount: 10_50, currency: :USD}Get supported currencies:
iex> MyApp.CurrencyConversion.get_currencies()
[:EUR, :USD, :CHF, ...]Manually refresh exchange rates:
iex> MyApp.CurrencyConversion.refresh_rates()
:ok