1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
# frozen_string_literal: true
module JMESPath
# @api private
class Runtime
# @api private
DEFAULT_PARSER = CachingParser
# Constructs a new runtime object for evaluating JMESPath expressions.
#
# runtime = JMESPath::Runtime.new
# runtime.search(expression, data)
# #=> ...
#
# ## Caching
#
# When constructing a {Runtime}, the default parser caches expressions.
# This significantly speeds up calls to {#search} multiple times
# with the same expression but different data. To disable caching, pass
# `:cache_expressions => false` to the constructor or pass a custom
# `:parser`.
#
# @example Re-use a Runtime, caching enabled by default
#
# runtime = JMESPath::Runtime.new
# runtime.parser
# #=> #<JMESPath::CachingParser ...>
#
# @example Disable caching
#
# runtime = JMESPath::Runtime.new(cache_expressions: false)
# runtime.parser
# #=> #<JMESPath::Parser ...>
#
# @option options [Boolean] :cache_expressions (true) When `false`, a non
# caching parser will be used. When `true`, a shared instance of
# {CachingParser} is used. Defaults to `true`.
#
# @option options [Boolean] :disable_visit_errors (false) When `true`,
# no errors will be raised during runtime processing. Parse errors
# will still be raised, but unexpected data sent to visit will
# result in nil being returned.
#
# @option options [Parser,CachingParser] :parser
#
def initialize(options = {})
@parser = options[:parser] || default_parser(options)
end
# @return [Parser, CachingParser]
attr_reader :parser
# @param [String<JMESPath>] expression
# @param [Hash] data
# @return [Mixed,nil]
def search(expression, data)
optimized_expression = @parser.parse(expression).optimize
optimized_expression.visit(data)
end
private
def default_parser(options)
if options[:cache_expressions] == false
Parser.new(options)
else
DEFAULT_PARSER.new(options)
end
end
end
end
|