Module: Mpp::Units

Extended by:
T::Sig
Defined in:
lib/mpp/units.rb

Class Method Summary collapse

Class Method Details

.parse_units(value, decimals) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/mpp/units.rb', line 15

def parse_units(value, decimals)
  Kernel.raise ArgumentError, "amount is required" unless value.is_a?(String) && !value.strip.empty?

  stripped = value.strip
  d = Kernel.BigDecimal(stripped)
rescue ArgumentError
  Kernel.raise ArgumentError, "Invalid amount: #{value.inspect}"
else
  Kernel.raise ArgumentError, "amount must be finite" unless d.finite?
  Kernel.raise ArgumentError, "amount must be non-negative" if d.negative?

  result = d * (Kernel.BigDecimal(10)**decimals)
  int_result = result.to_i

  unless T.unsafe(result) == int_result
    Kernel.raise ArgumentError,
      "Amount #{value.inspect} with #{decimals} decimals produces fractional base units"
  end

  int_result
end

.transform_units(request) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/mpp/units.rb', line 40

def transform_units(request)
  return request unless request.key?("decimals")

  result = request.dup
  decimals = result.delete("decimals")

  Kernel.raise ArgumentError, "decimals must be an integer, got #{decimals.class.name}" unless decimals.is_a?(Integer)

  result["amount"] = parse_units(result["amount"], decimals).to_s if result.key?("amount")

  if result.key?("suggestedDeposit") && !result["suggestedDeposit"].nil?
    result["suggestedDeposit"] = parse_units(result["suggestedDeposit"], decimals).to_s
  end

  result
end