Module: SchemaGraphy::DataQuery::JSONPointer

Defined in:
lib/schemagraphy/data_query/json_pointer.rb

Overview

Resolves JSON Pointer queries against a Hash or Array.

Class Method Summary collapse

Class Method Details

.resolve(data, pointer) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
# File 'lib/schemagraphy/data_query/json_pointer.rb', line 9

def resolve data, pointer
  return data if pointer.nil? || pointer == ''
  raise ArgumentError, "Invalid JSON Pointer: #{pointer}" unless pointer.start_with?('/')

  tokens = pointer.split('/')[1..]
  tokens.reduce(data) do |current, token|
    key = unescape(token)
    resolve_token(current, key, pointer)
  end
end

.resolve_token(current, key, pointer) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/schemagraphy/data_query/json_pointer.rb', line 20

def resolve_token current, key, pointer
  case current
  when Array
    index = Integer(key, 10)
    current.fetch(index)
  when Hash
    return current.fetch(key) if current.key?(key)
    return current.fetch(key.to_sym) if current.key?(key.to_sym)

    raise KeyError, "JSON Pointer not found: #{pointer}"
  else
    raise KeyError, "JSON Pointer not found: #{pointer}"
  end
rescue ArgumentError, IndexError, KeyError
  raise KeyError, "JSON Pointer not found: #{pointer}"
end

.unescape(token) ⇒ Object



37
38
39
# File 'lib/schemagraphy/data_query/json_pointer.rb', line 37

def unescape token
  token.gsub('~1', '/').gsub('~0', '~')
end