Sha256: ea10e6803fd7c166066ccb1dd3fa3a91a4082df9aae990cc76afe5bfb6839cdd

Contents?: true

Size: 1.47 KB

Versions: 3

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

module Bemer
  class Predicate
    def initialize(**options)
      @block     = options[:block]
      @condition = options[:condition].nil? ? true : options[:condition]
      @element   = options[:elem]
      @mask      = build_mask(options[:block], options[:elem])
      @mixins    = Mixes.new(options[:mix])
      @modifiers = ModifierList.new(:block, :elem, options[:mods])
      @wildcard  = nil
    end

    def match?(node)
      condition?(node) && mix?(node.mix) && mods?(node.mods)
    end

    def name_match?(name)
      Bemer.can_use_new_matcher? ? mask.match?(name) : mask =~ name
    end

    def wildcard?
      return wildcard unless wildcard.nil?

      @wildcard = name.include?('*')
    end

    protected

    attr_reader :block, :element, :condition, :mask, :mixins, :name, :wildcard

    def condition?(node)
      return condition unless condition.respond_to?(:call)

      condition.call Context.new(node)
    end

    def mix?(mix)
      (mixins.to_a - mix).empty?
    end

    def mods?(mods)
      return false if modifiers.keys.length > mods.keys.length

      modifiers.all? do |name, value|
        val = mods[name]

        val.nil? ? false : (Array(value) - Array(val)).empty?
      end
    end

    def modifiers
      @modifiers.to_h
    end

    def build_mask(block, element)
      @name = Bemer.entity_name(block, element)

      name.eql?('*') ? /^((?!#{Bemer.element_name_separator}).)*$/ : /^#{name.gsub('*', '.*')}$/
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
bemer-0.6.0 lib/bemer/predicate.rb
bemer-0.5.0 lib/bemer/predicate.rb
bemer-0.4.0 lib/bemer/predicate.rb