Class: JSONP3::RelativePointer
- Inherits:
-
Object
- Object
- JSONP3::RelativePointer
- Defined in:
- lib/json_p3/relative_pointer.rb
Overview
A relative JSON Pointer. See https://datatracker.ietf.org/doc/html/draft-hha-relative-json-pointer
Constant Summary collapse
- RE_RELATIVE_POINTER =
/\A(?<ORIGIN>\d+)(?<INDEX_G>(?<SIGN>[+-])(?<INDEX>\d))?(?<POINTER>.*)\z/m- RE_INT =
/\A(0|[1-9][0-9]*)\z/
Instance Method Summary collapse
-
#initialize(rel) ⇒ RelativePointer
constructor
A new instance of RelativePointer.
-
#to(pointer) ⇒ Pointer
Return a new JSON Pointer by applying this relative pointer to pointer.
- #to_s ⇒ Object
Constructor Details
#initialize(rel) ⇒ RelativePointer
Returns a new instance of RelativePointer.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/json_p3/relative_pointer.rb', line 11 def initialize(rel) match = RE_RELATIVE_POINTER.match(rel) raise JSONP3::Pointer::SyntaxError, "failed to parse relative pointer" if match.nil? @origin = parse_int(match[:ORIGIN] || raise) @index = 0 if match[:INDEX_G] @index = parse_int(match[:INDEX] || raise) raise JSONP3::Pointer::SyntaxError, "index offset can't be zero" if @index.zero? @index = -@index if match[:SIGN] == "-" end @pointer = match[:POINTER] == "#" ? "#" : Pointer.new(match[:POINTER] || raise) end |
Instance Method Details
#to(pointer) ⇒ Pointer
Return a new JSON Pointer by applying this relative pointer to pointer.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/json_p3/relative_pointer.rb', line 38 def to(pointer) p = pointer.is_a?(String) ? Pointer.new(pointer) : pointer if @origin > p.tokens.length raise JSONP3::Pointer::IndexError, "origin (#{@origin}) exceeds root (#{p.tokens.length})" end tokens = @origin < 1 ? p.tokens[0..] || raise : p.tokens[0...-@origin] || raise tokens[-1] = (tokens[-1] || raise) + @index if @index != 0 && tokens.length.positive? && tokens[-1].is_a?(Integer) if @pointer == "#" tokens[-1] = "##{tokens[-1]}" else tokens.concat(@pointer.tokens) # steep:ignore end Pointer.new(Pointer.encode(tokens)) end |
#to_s ⇒ Object
29 30 31 32 33 |
# File 'lib/json_p3/relative_pointer.rb', line 29 def to_s sign = @index.positive? ? "+" : "" index = @index.zero? ? "" : "#{sign}#{@index}" "#{@origin}#{index}#{@pointer}" end |