class InputLoop

Constants

DEFAULT_HINT

Public Instance Methods

gets(message, list = 'Yn', **hint) click to toggle source
# File lib/helpers/lib/input_loop.rb, line 4
def gets(message, list = 'Yn', **hint)
  default, list = build_list(list)
  keys_hint, hint = build_hint(list, hint)

  print("#{message} (#{hint}) #{keys_hint}")
  wait_valid_input(keys_hint, Set.new(list.map(&:downcase)), default)
end

Private Instance Methods

build_hint(list, hint) click to toggle source
# File lib/helpers/lib/input_loop.rb, line 30
def build_hint(list, hint)
  valid = "[#{list.join('')}]"
  hint = DEFAULT_HINT.merge(hint.map { |k, v| [k.to_s.downcase, v] }.to_h)
  hint = list.map do |c|
    h = hint[c.downcase]
    next if h.blank?

    "#{c.upcase}=#{h}"
  end
  [valid, hint.join(', ')]
end
build_list(list) click to toggle source
# File lib/helpers/lib/input_loop.rb, line 24
def build_list(list)
  list = list.chars
  default = list.find { |c| c.upcase == c }
  [default.downcase, list.map { |c| c == default ? c : c.downcase }.uniq]
end
wait_valid_input(keys_hint, keys, default) click to toggle source
# File lib/helpers/lib/input_loop.rb, line 14
def wait_valid_input(keys_hint, keys, default)
  loop do
    r = STDIN.gets.chop.downcase
    break default if r == ''
    break r if keys.include?(r)

    print "  [INVALID!] Please retry: #{keys_hint}:"
  end
end