defmodule Money.Sigil do @doc ~S""" Implements the sigil `~M` for Money The lower case `~m` variant does not exist as interpolation and excape characters are not useful for Money sigils. ## Example iex> import Money.Sigil iex> ~M[1000]usd Money.new(:USD, "1000") iex> ~M[1000.34]usd Money.new(:USD, "1000.34") """ @spec sigil_M(binary, list) :: Money.t() | {:error, {Exception.t(), String.t()}} def sigil_M(amount, [_, _, _] = currency) do Money.new(to_decimal(amount), atomize(currency)) end defp to_decimal(string) do string |> String.replace("_", "") |> Decimal.new() end defp atomize(currency) do currency |> List.to_string() |> validate_currency! end def validate_currency!(currency) do case Money.validate_currency(currency) do {:ok, currency} -> currency {:error, {_exception, reason}} -> raise Money.UnknownCurrencyError, reason end end end