Class: Tidied::Filtering

Inherits:
Object
  • Object
show all
Defined in:
lib/tidied/filtering.rb

Instance Method Summary collapse

Constructor Details

#initialize(*instructions) ⇒ Filtering

Returns a new instance of Filtering.



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/tidied/filtering.rb', line 7

def initialize(*instructions)
  @defaults = {
    operator: :==,
    accessor: :itself,
    value: nil,
    case_sensitive: true
  }
  @instructions = instructions.map do |instruction|
    @defaults.merge(instruction)
  end
end

Instance Method Details

#execute(collection) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/tidied/filtering.rb', line 19

def execute(collection)
  return false unless collection.respond_to? :select

  @instructions.reduce(collection) do |output, instruction|
    output.select do |item|
      raw_value             =   access_value(from: item, at: instruction[:accessor])
      attribute_value       =   process_value(from: raw_value, given: instruction)

      next false if not attribute_value.respond_to?(instruction[:operator])

      operator_method       =   attribute_value.method(instruction[:operator])
      query_value           =   process_value(from: instruction[:value], given: instruction)

      if operator_method.arity.zero?
        operator_method.call
      elsif operator_method.arity == 1
        operator_method.call(query_value)
      elsif operator_method.arity.abs.positive?
        operator_method.call(*query_value)
      else
        raise Error.new("invalid operator `#{instruction[:operator]}` for `#{attribute_value}` at `#{instruction[:accessor]}`")
      end
    end
  end
end