Class: JSONP3::RelativePointer

Inherits:
Object
  • Object
show all
Defined in:
lib/json_p3/relative_pointer.rb

Overview

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

Constructor Details

#initialize(rel) ⇒ RelativePointer

Returns a new instance of RelativePointer.

Parameters:

  • rel (String)

Raises:



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.

Parameters:

Returns:



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_sObject



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