class VinUtils::Validator

Constants

DIGIT_BASE
MAP
WEIGHTS

Attributes

vin[RW]

Public Class Methods

new(vin) click to toggle source
# File lib/vin_utils/validator.rb, line 9
def initialize(vin)
  @vin = vin
  @vin = @vin.upcase if @vin.instance_of?(String)
end

Public Instance Methods

calculate_check_digit() click to toggle source
# File lib/vin_utils/validator.rb, line 20
def calculate_check_digit
  return :invalid unless valid_input?

  sum = 0
  @vin.chars.each_with_index do |char, i|
    sum += transliterate(char) * WEIGHTS[i]
  end

  MAP[sum % 11]
end
suggest_valid_vin() click to toggle source
# File lib/vin_utils/validator.rb, line 31
def suggest_valid_vin
  return :invalid unless valid_input?
  return @vin if valid?

  new_vin = @vin.dup
  new_vin[8] = calculate_check_digit
  new_vin
end
valid?() click to toggle source
# File lib/vin_utils/validator.rb, line 14
def valid?
  return false unless valid_input?

  calculate_check_digit == @vin[8]
end

Private Instance Methods

transliterate(char) click to toggle source
# File lib/vin_utils/validator.rb, line 42
def transliterate(char)
  DIGIT_BASE.index(char) % 10
end
valid_input?() click to toggle source
# File lib/vin_utils/validator.rb, line 46
def valid_input?
  return false unless @vin.instance_of?(String)
  return false if @vin.chars.size != 17

  @vin.chars.all? do |char|
    DIGIT_BASE.include?(char) && char != '.'
  end
end