Sha256: 4298b5487de6b518e18cb19868ee27ff509dd2964cbaf027fdbc3a9312b185cc

Contents?: true

Size: 941 Bytes

Versions: 1

Compression:

Stored size: 941 Bytes

Contents

module Alder
  class Predicate
    def initialize(fragment)
      @fragment = fragment
    end

    def match(hash)
      node_match(@fragment, hash)
    end

    private

    def node_match(fragment, hash)
      fragment.all? do |f_key, f_value|
        keys = key_match(f_key, hash)
        next false if keys.empty?

        values = value_match(f_value, keys, hash)
        !values.empty?
      end
    end

    def key_match(key, hash)
      matches = []
      if key.is_a?(Regexp)
        hash.each do |k, v|
          matches << k if key =~ k
        end
      else
        matches << key if hash.has_key?(key)
      end
      matches
    end

    def value_match(value, keys, hash)
      matches = []
      keys.each do |k|
        v = hash[k]
        if value == :_ || value == v
          matches << v
        elsif v.is_a?(Hash) && node_match(value, v)
          matches << v
        end
      end
      matches
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
alder-0.1.0 lib/alder/predicate.rb