module Genesis::PromptCLI

Public Class Methods

ask(question, seconds = 30, default = false) click to toggle source
# File lib/promptcli.rb, line 5
def self.ask question, seconds = 30, default = false
  old_attributes = Termios.tcgetattr($stdin)
  new_attributes = old_attributes.dup
  new_attributes.lflag &= ~Termios::ICANON
  Termios::tcsetattr($stdin, Termios::TCSANOW, new_attributes)
  
  start_time   = Time.now
  end_time     = start_time + seconds
  begin
    prompt_format = "%s [%d] (%s/%s) "
    prompt = prompt_format % [question, seconds.to_i, default ? "Y" : "y", default ? "n" : "N"] 
    prompt_length = seconds < 10 ? prompt.length+1 : prompt.length
    $stdout.write(prompt)
    $stdout.flush
 
    # Wait until input is available
    if select([$stdin], [], [], seconds % 1)
      case char = $stdin.getc
      when ?y, ?Y then return true
      when ?n, ?N then return false
      else                  # NOOP
      end
    end
 
    $stdout.write("\b" * prompt_length)
    $stdout.flush

    seconds = end_time - Time.now
  end while seconds > 0.0
  
  return default
ensure
  Termios::tcsetattr($stdin, Termios::TCSANOW, old_attributes)
  $stdout.puts
end