class Cdigits::Luhn::Placeholder

Constants

CHECK_DIGIT_SYMBOL

@note any good idia?

NON_ZERO_SYMBOL
NUMERIC_SYMBOL

Public Class Methods

new(characters) click to toggle source

@param [Array<String>] characters

# File lib/cdigits/luhn/placeholder.rb, line 14
def initialize(characters)
  @characters = characters
end

Public Instance Methods

fill(placeholder) click to toggle source

Generate code @param [String] placeholder @return [String]

# File lib/cdigits/luhn/placeholder.rb, line 21
def fill(placeholder)
  codes = []
  store = build_store(placeholder) do |char, digit|
    codes << (digit.nil? ? char : nil)
  end

  store.fill_check_digit
  generate_code(codes, store.digits)
end
valid?(placeholder) click to toggle source

Validate code @param [String] placeholder @return [Boolean]

# File lib/cdigits/luhn/placeholder.rb, line 34
def valid?(placeholder)
  store = build_store(placeholder)
  (store.sum % modulus).zero?
end

Private Instance Methods

build_store(placeholder) { |char, digit| ... } click to toggle source
# File lib/cdigits/luhn/placeholder.rb, line 45
def build_store(placeholder)
  store = ::Cdigits::Luhn::Store.new(modulus: modulus)
  placeholder.chars.each do |char|
    digit = generate_digit(char, store)
    yield char, digit if block_given?
  end
  store
end
generate_code(chars, digits) click to toggle source
# File lib/cdigits/luhn/placeholder.rb, line 54
def generate_code(chars, digits)
  chars.map do |char|
    char || @characters[digits.shift]
  end.join
end
generate_digit(char, store) click to toggle source
# File lib/cdigits/luhn/placeholder.rb, line 60
def generate_digit(char, store)
  case char
  when NON_ZERO_SYMBOL
    store.append_non_zero_number
  when NUMERIC_SYMBOL
    store.append_number
  when CHECK_DIGIT_SYMBOL
    store.initialize_check_digit
  when *@characters
    store.append(@characters.index(char))
  end
end
modulus() click to toggle source
# File lib/cdigits/luhn/placeholder.rb, line 41
def modulus
  @modulus ||= @characters.size
end