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
- .resolve(data, pointer) ⇒ Object
- .resolve_token(current, key, pointer) ⇒ Object
- .unescape(token) ⇒ Object
Class Method Details
.resolve(data, pointer) ⇒ Object
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 |