Class: Igniter::Extensions::Contracts::Language::ScalePack::Definition

Inherits:
Object
  • Object
show all
Defined in:
lib/igniter/extensions/contracts/language/scale_pack.rb

Instance Method Summary collapse

Constructor Details

#initialize(name:, source_name:) ⇒ Definition

Returns a new instance of Definition.



52
53
54
55
56
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 52

def initialize(name:, source_name:)
  @name = name.to_sym
  @source_name = source_name.to_sym
  @steps = []
end

Instance Method Details

#add(value) ⇒ Object



68
69
70
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 68

def add(value)
  add_step(:add, value)
end

#clamp(min, max) ⇒ Object

Raises:

  • (ArgumentError)


76
77
78
79
80
81
82
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 76

def clamp(min, max)
  minimum = Float(min)
  maximum = Float(max)
  raise ArgumentError, "scale :#{@name} clamp min cannot exceed max" if minimum > maximum

  @steps << { operation: :clamp, min: minimum, max: maximum }
end

#divide_by(value) ⇒ Object

Raises:

  • (ArgumentError)


58
59
60
61
62
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 58

def divide_by(value)
  raise ArgumentError, "scale :#{@name} divide_by cannot use zero" if Float(value).zero?

  add_step(:divide_by, value)
end

#multiply_by(value) ⇒ Object



64
65
66
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 64

def multiply_by(value)
  add_step(:multiply_by, value)
end

#resolve(source_value) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 92

def resolve(source_value)
  current = Float(source_value)
  trace = []

  @steps.each do |step|
    before = current
    current = apply_step(current, step)
    trace << step.merge(before: before, after: current)
  end

  {
    value: current,
    source: @source_name,
    source_value: source_value,
    steps: trace.freeze
  }
rescue ArgumentError, TypeError
  {
    value: 0.0,
    source: @source_name,
    source_value: source_value,
    error: :invalid_numeric_source,
    steps: trace.freeze
  }
end

#round(precision = 0) ⇒ Object



84
85
86
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 84

def round(precision = 0)
  @steps << { operation: :round, precision: Integer(precision) }
end

#subtract(value) ⇒ Object



72
73
74
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 72

def subtract(value)
  add_step(:subtract, value)
end

#validate!Object

Raises:

  • (ArgumentError)


88
89
90
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 88

def validate!
  raise ArgumentError, "scale :#{@name} requires at least one step" if @steps.empty?
end