Sha256: e3d4f6becba4d7c29016a5a219318db5cd47a9f95ff0d55d363c3ec8fa7eb40d

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

# Scans for occurrences of a key in a line of text and returns any associated
# values.
#
# Looks for the following patterns of key-value pairs:
# KEY=value
# KEY='value'
# KEY="value"
# KEY value
# KEY 'value'
# KEY "value"
# KEY: value
# KEY => value
class Carwash::ValueDiscoverer < Struct.new(:key)
  ESCAPE_CHARACTERS = {
    "\\0" => "\0",
    "\\a" => "\a",
    "\\b" => "\b",
    "\\f" => "\f",
    "\\n" => "\n",
    "\\r" => "\r",
    "\\t" => "\t",
    "\\v" => "\v",
  }

  def discover(line)
    patterns.flat_map { |pattern|
      line.scan(pattern).map(&:first)
    }.reject(&:nil?).reject(&:empty?).map(&:downcase).map { |val|
      unescape_value(val)
    }
  end

  def patterns
    @patterns ||= [
      %r{#{key}['"]?\s*(?:=>|=|:|\s+)\s*'((?:\\'|[^'])+)'}i,
      %r{#{key}['"]?\s*(?:=>|=|:|\s+)\s*"((?:\\"|[^"])+)"}i,
      %r{#{key}['"]?\s*(?:=>|=|:|\s+)\s*((?:\\\s|\\"|\\'|[^\s'"])+)}i
    ]
  end

  def unescape_value(value)
    value.gsub(/\\(.)/) { |match|
      ESCAPE_CHARACTERS.fetch(match, $1)
    }
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
carwash-1.0.6 lib/carwash/value_discoverer.rb