class RgGen::Core::InputBase::InputMatcher

Constants

COMPRESS_BLANK_PATTERN
DELETE_BLANK_PATTERN

Public Class Methods

new(pattern_or_patterns, **options, &converter) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 7
def initialize(pattern_or_patterns, **options, &converter)
  @options = options
  @converter = converter
  @patterns = format_patterns(pattern_or_patterns)
end

Public Instance Methods

match(rhs) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 13
def match(rhs)
  rhs
    .to_s
    .yield_self { |s| ignore_blanks? && delete_blanks(s) || s }
    .yield_self(&method(:match_patterns))
end
match_automatically?() click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 20
def match_automatically?
  @options.fetch(:match_automatically, true)
end

Private Instance Methods

convert_match_data(match_data) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 72
def convert_match_data(match_data)
  @converter&.call(match_data) || match_data
end
delete_blanks(rhs) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 57
def delete_blanks(rhs)
  rhs
    .strip
    .gsub(DELETE_BLANK_PATTERN, '')
    .gsub(COMPRESS_BLANK_PATTERN, ' ')
end
expand_patterns(pattern_or_patterns) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 35
def expand_patterns(pattern_or_patterns)
  Array(pattern_or_patterns).each_with_object({}) do |pattern, patterns|
    if pattern.is_a? Hash
      patterns.update(pattern)
    else
      patterns[patterns.size] = pattern
    end
  end
end
format_patterns(pattern_or_patterns) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 26
def format_patterns(pattern_or_patterns)
  if @options.fetch(:match_wholly, true)
    expand_patterns(pattern_or_patterns)
      .transform_values { |pattern| /\A#{pattern}\z/ }
  else
    expand_patterns(pattern_or_patterns)
  end
end
ignore_blanks?() click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 45
def ignore_blanks?
  @options.fetch(:ignore_blanks, true)
end
match_patterns(rhs) click to toggle source
# File lib/rggen/core/input_base/input_matcher.rb, line 64
def match_patterns(rhs)
  index, match_data =
    @patterns
      .transform_values { |pattern| pattern.match(rhs) }
      .max_by { |_, m| m && m[0].length || 0 }
  match_data && [convert_match_data(match_data), index]
end