Class: Opera::Operation::Builder::OptionsBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/opera/operation/builder/options_builder.rb

Constant Summary collapse

ALLOWED_OPTIONS =
%i[if unless].freeze

Class Method Summary collapse

Class Method Details

.build(opts) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
# File 'lib/opera/operation/builder/options_builder.rb', line 9

def self.build(opts)
  return {} if opts.empty?

  unknown = opts.keys - ALLOWED_OPTIONS
  raise ArgumentError, "Unknown option(s): #{unknown.inspect}. Allowed: #{ALLOWED_OPTIONS}" if unknown.any?

  { predicate: build_predicate(opts) }.compact
end

.build_predicate(opts) ⇒ Object

Raises:

  • (ArgumentError)


18
19
20
21
22
23
24
25
# File 'lib/opera/operation/builder/options_builder.rb', line 18

def self.build_predicate(opts)
  return nil unless opts[:if] || opts[:unless]
  raise ArgumentError, 'Cannot use :if and :unless together' if opts[:if] && opts[:unless]

  cond = opts[:if] || opts[:unless]
  condition_proc = cond.is_a?(Symbol) ? proc { send(cond) } : cond
  opts.key?(:if) ? condition_proc : proc { !instance_exec(&condition_proc) }
end