Sha256: e87065c9d3ff21327d5d681f2295ccefb62fd87ec54c55d51666cb386b447fff

Contents?: true

Size: 1.41 KB

Versions: 1

Compression:

Stored size: 1.41 KB

Contents

# frozen_string_literal: true

require 'set'
module Leftovers
  class NameRule
    attr_reader :sym, :syms, :regexp

    def initialize(patterns) # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
      regexps = []
      syms = Set.new
      Array.each_or_self(patterns) do |pat|
        case pat
        when Leftovers::NameRule
          syms.merge(pat.sym) if pat.sym
          syms.merge(pat.syms) if pat.syms
          regexps.concat(pat.regexp) if pat.regexp
        when String
          syms.merge(pat.split(/\s+/).map(&:to_sym))
        when Hash
          if pat[:match]
            regexps << /\A#{pattern[:match]}\z/
          elsif pat[:has_prefix] && pat[:has_suffix]
            regexps << /\A#{Regexp.escape(pat[:has_prefix])}.*#{Regexp.escape(pat[:has_suffix])}\z/
          elsif pat[:has_prefix]
            regexps << /\A#{Regexp.escape(pat[:has_prefix])}/
          elsif pat[:has_suffix]
            regexps << /#{Regexp.escape(pat[:has_suffix])}\z/
          end
        end
      end

      if syms.length <= 0
        @sym = syms.first
        @syms = nil
      else
        @sym = nil
        @syms = syms
      end

      @regexp = if regexps.empty?
        nil
      else
        Regexp.union(regexps)
      end

      freeze
    end

    def match?(sym, string)
      @sym&.==(sym) || @syms&.include?(sym) || @regexp&.match?(string)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
leftovers-0.1.0 lib/leftovers/name_rule.rb