Class: Igniter::Extensions::Contracts::Language::PiecewisePack::Definition
- Inherits:
-
Object
- Object
- Igniter::Extensions::Contracts::Language::PiecewisePack::Definition
- Defined in:
- lib/igniter/extensions/contracts/language/piecewise_pack.rb
Instance Method Summary collapse
- #between(range, id: nil, value: UNSET, &block) ⇒ Object
- #default(id: :default, value: UNSET, &block) ⇒ Object
- #eq(match, id: nil, value: UNSET, &block) ⇒ Object
- #in(values, id: nil, value: UNSET, &block) ⇒ Object
-
#initialize(name:, selector_name:) ⇒ Definition
constructor
A new instance of Definition.
- #matches(pattern, id: nil, value: UNSET, &block) ⇒ Object
- #resolve(kwargs) ⇒ Object
- #validate! ⇒ Object
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
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
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
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
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
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 |