Module: Finrb::Validation

Defined in:
lib/finrb/validation.rb

Overview

Shared validation and decimal coercion for public financial inputs.

Class Method Summary collapse

Class Method Details

.decimal(value, name:) ⇒ Object



10
11
12
13
14
15
16
17
18
19
# File 'lib/finrb/validation.rb', line 10

def decimal(value, name:)
  raise(ArgumentError, "#{name} must be numeric.") unless value.is_a?(Numeric)

  decimal = value.is_a?(Flt::DecNum) ? value : Flt::DecNum.new(value.to_s)
  raise(ArgumentError, "#{name} must be finite.") unless decimal.finite?

  decimal
rescue Flt::Num::Exception, FloatDomainError, Math::DomainError => e
  raise(ArgumentError, "#{name} must be a finite numeric value.", e.backtrace)
end

.decimal_at_least(value, minimum:, name:, error: ArgumentError) ⇒ Object

Raises:

  • (error)


48
49
50
51
52
53
# File 'lib/finrb/validation.rb', line 48

def decimal_at_least(value, minimum:, name:, error: ArgumentError)
  decimal = decimal(value, name:)
  raise(error, "#{name} must be greater than or equal to #{minimum}.") if decimal < minimum

  decimal
end

.decimal_between(value, minimum:, maximum:, name:, error: ArgumentError) ⇒ Object

Raises:

  • (error)


62
63
64
65
66
67
# File 'lib/finrb/validation.rb', line 62

def decimal_between(value, minimum:, maximum:, name:, error: ArgumentError)
  decimal = decimal(value, name:)
  raise(error, "#{name} must be between #{minimum} and #{maximum}, inclusive.") unless decimal.between?(minimum, maximum)

  decimal
end

.decimal_greater_than(value, minimum:, name:, error: ArgumentError) ⇒ Object

Raises:

  • (error)


41
42
43
44
45
46
# File 'lib/finrb/validation.rb', line 41

def decimal_greater_than(value, minimum:, name:, error: ArgumentError)
  decimal = decimal(value, name:)
  raise(error, "#{name} must be greater than #{minimum}.") if decimal <= minimum

  decimal
end

.non_negative_decimal(value, name:, error: ArgumentError, message: nil) ⇒ Object

Raises:

  • (error)


34
35
36
37
38
39
# File 'lib/finrb/validation.rb', line 34

def non_negative_decimal(value, name:, error: ArgumentError, message: nil)
  decimal = decimal(value, name:)
  raise(error, message || "#{name} must be greater than or equal to zero.") if decimal.negative?

  decimal
end

.non_zero_decimal(value, name:, error: ArgumentError) ⇒ Object

Raises:

  • (error)


55
56
57
58
59
60
# File 'lib/finrb/validation.rb', line 55

def non_zero_decimal(value, name:, error: ArgumentError)
  decimal = decimal(value, name:)
  raise(error, "#{name} must be non-zero.") if decimal.zero?

  decimal
end

.positive_decimal(value, name:, error: ArgumentError, message: nil) ⇒ Object

Raises:

  • (error)


27
28
29
30
31
32
# File 'lib/finrb/validation.rb', line 27

def positive_decimal(value, name:, error: ArgumentError, message: nil)
  decimal = decimal(value, name:)
  raise(error, message || "#{name} must be greater than zero.") unless decimal.positive?

  decimal
end

.positive_integer(value, name:) ⇒ Object

Raises:

  • (ArgumentError)


21
22
23
24
25
# File 'lib/finrb/validation.rb', line 21

def positive_integer(value, name:)
  raise(ArgumentError, "#{name} must be a positive integer.") unless value.is_a?(Integer) && value.positive?

  value
end