Sha256: 390696435edbc70d73701b39198b6c3ec02398c2b86bde3d424f4ce10b7b182a

Contents?: true

Size: 1.19 KB

Versions: 1

Compression:

Stored size: 1.19 KB

Contents

module Airborne
	module PathMatcher
		def get_by_path(path, json, &block)
			type = false
			parts = path.split('.')
			parts.each_with_index do |part, index|
				if part == '*' || part == '?'
					type = part
					raise "Expected #{path} to be array got #{json.class} from JSON response" unless json.class == Array
					if index < parts.length - 1
						json.each do |element|
							sub_path = parts[(index + 1)..(parts.length-1)].join('.')
							get_by_path(sub_path, element, &block)
						end
						return
					end
					next
				end
				if /^[\d]+(\.[\d]+){0,1}$/ === part
					part = part.to_i
					json = json[part]
				else
					json = json[part.to_sym]
					raise "Expected #{path} to be object or array got #{json.class} from JSON response" unless json.class == Array || json.class == Hash || json.nil?
				end
			end
			if type == '*'
				json.each{|part| yield part}
			elsif type == '?'
				item_count = json.length
				error_count = 0
				json.each do |part|
					begin
						yield part
					rescue Exception => e
						error_count += 1
						raise "Expected one object in path #{path} to match provided JSON values" if item_count == error_count
					end
				end
			else
				yield json
			end
		end
	end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
airborne-0.0.17 lib/airborne/path_matcher.rb