defmodule Stellar.TxBuild.Amount do
@moduledoc """
`Amount` struct definition.
"""
alias StellarBase.XDR.Int64
@behaviour Stellar.TxBuild.XDR
@unit 10_000_000
@max_size 9_223_372_036_854_775_807
@type amount :: non_neg_integer() | float()
@type t :: %__MODULE__{amount: amount(), raw: non_neg_integer()}
defstruct [:amount, :raw]
@impl true
def new(amount, opts \\ [])
def new(:max, _opts) do
%__MODULE__{amount: @max_size / @unit, raw: @max_size}
end
def new(amount, _opts) when is_number(amount) and amount >= 0 and amount <= @max_size do
%__MODULE__{amount: amount, raw: trunc(amount * @unit)}
end
def new(_amount, _opts), do: {:error, :invalid_amount}
@impl true
def to_xdr(%__MODULE__{raw: raw}) do
Int64.new(raw)
end
end