class MixedGauge::ClusterConfig::Validator

Validator

Public Class Methods

new(slot_size, connection_registry) click to toggle source

@param [Integer] slot_size @param [Hash{Range => Symbol}] connection_registry

# File lib/mixed_gauge/cluster_config.rb, line 49
def initialize(slot_size, connection_registry)
  @slot_size = slot_size
  @connection_registry = connection_registry
end

Public Instance Methods

validate!() click to toggle source

@raise [RuntimeError]

# File lib/mixed_gauge/cluster_config.rb, line 55
def validate!
  all_start_points = @connection_registry.keys.map(&:min).sort
  all_end_points = @connection_registry.keys.map(&:max).sort

  check_first_start_point(all_start_points.min)
  check_coverage(all_start_points, all_end_points)
  check_last_end_point(all_end_points.max)
end

Private Instance Methods

check_coverage(all_start_points, all_end_points) click to toggle source

@param [Array<Integer>] all_start_points @param [Array<Integer>] all_end_points

# File lib/mixed_gauge/cluster_config.rb, line 73
def check_coverage(all_start_points, all_end_points)
  all_end_points.each_with_index do |end_point, i|
    break if all_end_points.size == i + 1

    next_start_point = all_start_points[i + 1]
    report_invalid_coverage(end_point, all_start_points[i + 1]) unless end_point.succ == next_start_point
  end
end
check_first_start_point(first_start_point) click to toggle source

@param [Integer] first_start_point

# File lib/mixed_gauge/cluster_config.rb, line 67
def check_first_start_point(first_start_point)
  report_invalid_first_start_point(first_start_point) unless first_start_point.zero?
end
check_last_end_point(last_end_point) click to toggle source

@param [Integer] last_end_point

# File lib/mixed_gauge/cluster_config.rb, line 83
def check_last_end_point(last_end_point)
  report_invalid_last_end_point(last_end_point) unless last_end_point == @slot_size - 1
end
report_invalid_coverage(end_point, next_start_point) click to toggle source

@param [Integer] end_point @param [Integer] next_start_point rubocop:disable Metrics/LineLength

# File lib/mixed_gauge/cluster_config.rb, line 97
def report_invalid_coverage(end_point, next_start_point)
  end_point_slot = @connection_registry.keys.find { |range| range.max == end_point }
  end_point_connection = @connection_registry[end_point_slot]
  start_point_slot = @connection_registry.keys
                                         .find { |range| range.min == next_start_point && range.max != end_point }
  start_point_connection = @connection_registry[start_point_slot]

  raise %(End point `#{end_point}` of "#{end_point_connection}" or start point `#{next_start_point}` of "#{start_point_connection}" is invalid. Next start point must be "previous end point + 1".)
end
report_invalid_first_start_point(point) click to toggle source

@param [Integer] point

# File lib/mixed_gauge/cluster_config.rb, line 88
def report_invalid_first_start_point(point)
  r = @connection_registry.keys.find { |range| range.min == point }
  connection = @connection_registry[r]
  raise "First start point must be `0` but given `#{point}`: invalid slot configuration for #{connection}"
end
report_invalid_last_end_point(point) click to toggle source

@param [Integer] point rubocop:disable Metrics/LineLength

# File lib/mixed_gauge/cluster_config.rb, line 110
def report_invalid_last_end_point(point)
  r = @connection_registry.keys.find { |range| range.max == point }
  connection = @connection_registry[r]
  raise "Last end point must be `#{@slot_size - 1}` but given `#{point}`: invalid slot configuration for #{connection}"
end