module Aerospike::Peers::Parse

Parse the response from peers command

Constants

BASE_REGEX
Object

Object representing the parsed response from peers command

Public Class Methods

call(response) click to toggle source
# File lib/aerospike/peers/parse.rb, line 31
def call(response)
  gen, port, peers = parse_base(response)

  ::Aerospike::Peers::Parse::Object.new.tap do |obj|
    obj.generation = gen.to_i
    obj.port_default = port.empty? ? nil : port.to_i
    obj.peers = parse_peers(peers, obj)
  end
end
parse_base(response) click to toggle source
# File lib/aerospike/peers/parse.rb, line 41
def parse_base(response)
 BASE_REGEX.match(response).to_a.last(3).tap do |parsed|
  # Expect three pieces parsed from the Regex
  raise ::Aerospike::Exceptions::Parse if parsed.size != 3
 end
end
parse_host(parser, peer) click to toggle source
# File lib/aerospike/peers/parse.rb, line 87
def parse_host(parser, peer)
  if parser.current == '[' # IPv6
    parser.step
    host = parser.read_until(']')
    # skip one extra if port is detected, to match read behavior below
    parser.step if parser.current == ':'
  else
    host = parser.read_until(',', ':', ']')
  end

  port = parser.prev == ':' ? parser.read_until(',', ']').to_i : nil

  if parser.prev == ',' || parser.prev == ']'
    return ::Aerospike::Host.new(host, port, peer.tls_name)
  end

  raise ::Aerospike::Exceptions::Parse, "Unterminated host in response"
end
parse_hosts(parser, peer) click to toggle source
# File lib/aerospike/peers/parse.rb, line 74
def parse_hosts(parser, peer)
  result = []
  parser.expect('[')
  return result if parser.current == ']'

  loop do
    result << parse_host(parser, peer)
    break if parser.current == ']'
  end

  result
end
parse_peer(parser, obj) click to toggle source
# File lib/aerospike/peers/parse.rb, line 60
def parse_peer(parser, obj)
  ::Aerospike::Peer.new.tap do |peer|
    parser.expect('[')
    peer.node_name = parser.read_until(',')
    peer.tls_name = parser.read_until(',')
    peer.hosts = parse_hosts(parser, peer)
    # Assign default port if missing
    peer.hosts.each do |host|
      host.port ||= obj.port_default
    end
    parser.expect(']')
  end
end
parse_peers(response, obj) click to toggle source
# File lib/aerospike/peers/parse.rb, line 48
def parse_peers(response, obj)
  return [] if response.empty?
  parser = ::Aerospike::Utils::StringParser.new(response)
  [].tap do |result|
    loop do
      result << parse_peer(parser, obj)
      break unless parser.current == ','
      parser.step
    end
  end
end