Class: Igniter::Extensions::Contracts::Language::PiecewisePack::Definition

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

Instance Method Summary collapse

Constructor Details

#initialize(name:, selector_name:) ⇒ Definition

Returns a new instance of Definition.



66
67
68
69
70
71
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 66

def initialize(name:, selector_name:)
  @name = name.to_sym
  @selector_name = selector_name.to_sym
  @cases = []
  @default_case = nil
end

Instance Method Details

#between(range, id: nil, value: UNSET, &block) ⇒ Object

Raises:

  • (ArgumentError)


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

def between(range, id: nil, value: UNSET, &block)
  raise ArgumentError, "piecewise :#{@name} between requires a Range" unless range.is_a?(Range)

  add_case(:between, range, id: id, value: value, block: block)
end

#default(id: :default, value: UNSET, &block) ⇒ Object

Raises:

  • (ArgumentError)


96
97
98
99
100
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 96

def default(id: :default, value: UNSET, &block)
  raise ArgumentError, "piecewise :#{@name} can define only one default" if @default_case

  @default_case = case_payload(:default, :default, id: id, value: value, block: block)
end

#eq(match, id: nil, value: UNSET, &block) ⇒ Object



73
74
75
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 73

def eq(match, id: nil, value: UNSET, &block)
  add_case(:eq, match, id: id, value: value, block: block)
end

#in(values, id: nil, value: UNSET, &block) ⇒ Object

Raises:

  • (ArgumentError)


83
84
85
86
87
88
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 83

def in(values, id: nil, value: UNSET, &block)
  array = Array(values)
  raise ArgumentError, "piecewise :#{@name} in requires a non-empty list" if array.empty?

  add_case(:in, array.freeze, id: id, value: value, block: block)
end

#matches(pattern, id: nil, value: UNSET, &block) ⇒ Object

Raises:

  • (ArgumentError)


90
91
92
93
94
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 90

def matches(pattern, id: nil, value: UNSET, &block)
  raise ArgumentError, "piecewise :#{@name} matches requires a Regexp" unless pattern.is_a?(Regexp)

  add_case(:matches, pattern, id: id, value: value, block: block)
end

#resolve(kwargs) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 115

def resolve(kwargs)
  selector_value = kwargs.fetch(@selector_name)
  selected = @cases.find { |entry| match?(entry, selector_value) } || @default_case

  {
    case: selected.fetch(:id),
    value: PiecewisePack.invoke_value(selected.fetch(:value), kwargs),
    matcher: selected.fetch(:matcher),
    matched_on: selected.fetch(:match),
    selector: @selector_name,
    selector_value: selector_value
  }
end

#validate!Object

Raises:

  • (ArgumentError)


102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/igniter/extensions/contracts/language/piecewise_pack.rb', line 102

def validate!
  raise ArgumentError, "piecewise :#{@name} requires at least one case" if @cases.empty?
  raise ArgumentError, "piecewise :#{@name} requires a default case" unless @default_case

  duplicate_ids = (@cases.map { |entry| entry.fetch(:id) } + [@default_case.fetch(:id)])
                  .group_by { |id| id }
                  .select { |_id, group| group.length > 1 }
                  .keys
  return if duplicate_ids.empty?

  raise ArgumentError, "piecewise :#{@name} has duplicate case ids: #{duplicate_ids.join(", ")}"
end