Sha256: 38904a70acceb5f41f18909c5109db98de7e993d20d018385dbecff91d2c11a6

Contents?: true

Size: 1.26 KB

Versions: 2

Compression:

Stored size: 1.26 KB

Contents

require 'strscan'
require File.join('jsonpath', 'enumerable')
require File.join('jsonpath', 'version')

class JsonPath

  attr_reader :path

  def initialize(path)
    scanner = StringScanner.new(path)
    @path = []
    bracket_count = 0
    while not scanner.eos?
      if token = scanner.scan(/\$/)
        @path << token
      elsif token = scanner.scan(/@/)
        @path << token
      elsif token = scanner.scan(/[a-zA-Z]+/)
        @path << "['#{token}']"
      elsif token = scanner.scan(/'(.*?)'/)
        @path << "[#{token}]"
      elsif token = scanner.scan(/\[/)
        count = 1
        while !count.zero?
          if t = scanner.scan(/\[/)
            token << t
            count += 1
          elsif t = scanner.scan(/\]/)
            token << t
            count -= 1
          elsif t = scanner.scan(/[^\[\]]*/)
            token << t
          end
        end
        @path << token
      elsif token = scanner.scan(/\.\./)
        @path << token
      elsif scanner.scan(/\./)
      elsif token = scanner.scan(/\*/)
        @path << token
      elsif token = scanner.scan(/./)
        @path.last << token
      end
    end
  end

  def on(object)
    JsonPath::Enumerable.new(self, object)
  end

  def self.on(object, path)
    self.new(path).on(object)
  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jsonpath-0.2.2 lib/jsonpath.rb
jsonpath-0.2.1 lib/jsonpath.rb