defmodule CurrencyConvert do
@moduledoc """
Documentation for `CurrencyConvert`.
"""
# API URL
@rates_url "https://api.exchangerate-api.com/v4/latest/"
def convert(amount, from_currency, to_currency) do
get_rates(from_currency, to_currency)
|> handle_rates()
|> convert_amount(amount, to_currency, from_currency)
end
defp get_rates(from_currency, to_currency) do
# Get the rates from the API
case HTTPoison.get("#{@rates_url}#{from_currency}") do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, Jason.decode!(body)["rates"]}
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} ->
{:error, "Request failed with status code #{status_code} and message #{body}"}
{:error, error} ->
# Return the error
error
end
end
defp handle_rates(:ok, rates) do
# Return the rates
rates
end
defp handle_rates(error), do: error
defp convert_amount({:error, error}, _rates, _to_currency, _from_currency) do
# Return the error
raise "Error: #{error}"
end
defp convert_amount(rates, amount, to_currency, from_currency) do
# Convert the amount
amount * Map.get(rates, to_currency) / Map.get(rates, from_currency)
end
end