Sha256: 317bfbe3e65c0567f17905b17250cff9a3023c6e018983ff8e73434b8f20e242

Contents?: true

Size: 978 Bytes

Versions: 2

Compression:

Stored size: 978 Bytes

Contents

# frozen_string_literal: true

module Fimon
  class Matcher
    def initialize(patterns)
      @patterns = Array(patterns).map {|pattern| to_regex(pattern) }
    end

    def match?(input)
      @patterns.any? {|pattern| pattern.match?(input) }
    end
    alias =~ match?

    private def to_regex(pattern)
      double = "__double__"
      single = "__single__"

      extension_groups = pattern.scan(/\{(.*?)\}/).flatten

      extension_groups.each_with_index do |group, index|
        pattern = pattern.gsub("{#{group}}", "__#{index}__")
      end

      pattern = pattern
                .gsub("**/", double)
                .gsub("*", single)

      pattern = Regexp.escape(pattern)
                      .gsub(double, "([^/]+/)*")
                      .gsub(single, "[^/]+")

      extension_groups.each_with_index do |group, i|
        pattern = pattern.gsub("__#{i}__", "(#{group.split(',').join('|')})")
      end

      Regexp.new("^#{pattern}$")
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fimon-0.0.1 lib/fimon/matcher.rb
fimon-0.0.0 lib/fimon/matcher.rb