module Input

Public Instance Methods

display_value() click to toggle source

this function is necessary to reduce code duplication of the password promt engine to a minimum

# File lib/inquirer/prompts/input.rb, line 135
def display_value
  @value
end
prompt(opts = {}) click to toggle source
# File lib/inquirer/prompts/input.rb, line 9
def prompt opts = {}
  @question = opts[:message]
  @default  = opts[:default]
  @value    = ''

  render_prompt

  cursor_position = 0

  IOHelper.read_char do |char|

    key = IOChar.char_to_key(char)

    @error_message = nil

    case key
    when 'backspace'

      index = @value.size - cursor_position - 1

      if index >= 0
        # remove char at current index
        @value[index] = ''
      end
    when 'left'
      if cursor_position < @value.length
        cursor_position += 1
      end
    when 'right'
      if cursor_position > 0
        cursor_position -= 1
      end
    when 'return'
      if not @default.nil? and @value == ''
        @value = @default.dup
      end

      if opts[:validate] and opts[:validate].is_a?(Proc)

        validation_result = opts[:validate].call( @value )

        if !validation_result
          @error_message = Inquirer::Style::Input.error_message_invalid_value
        elsif validation_result && validation_result.is_a?(String)
          @error_message = validation_result
        end
      end
    else
      if !['up', 'down'].include?(key)

        @value = @value.insert(@value.length - cursor_position, char)
      end
    end

    # flush previous data
    IOHelper.clear

    render_prompt

    update_cursor_position(cursor_position)

    if @error_message or key != 'return'
      true
    else
      false
    end
  end

  render_result

  # return the value
  @value
end
render_prompt() click to toggle source
# File lib/inquirer/prompts/input.rb, line 83
def render_prompt

  prompt = Inquirer::Style.question_prefix

  prompt += Inquirer::Style::Input.question % @question

  # render the default value
  if @default
    prompt += Inquirer::Style::Input.default % @default
  end

  # render the input
  prompt += Inquirer::Style::Input.value % display_value

  # render error message
  bottom_line = nil
  if @error_message
    bottom_line = Inquirer::Style::Input.error_message % @error_message
  end

  # rerender new prompt
  IOHelper.render( prompt, bottom_line )
end
render_result() click to toggle source
# File lib/inquirer/prompts/input.rb, line 107
def render_result

  # start with the question prefix
  result = Inquirer::Style.question_prefix

  # render the question
  result += Inquirer::Style::Input.question % @question

  # render the input
  result += Inquirer::Style::Input.response % display_value

  # finish up
  result += IOChar.clear_line + IOChar.newline

  # flush previous data
  IOHelper.clear

  # rerender result
  IOHelper.render( result )
end
update_cursor_position(cursor_position) click to toggle source
# File lib/inquirer/prompts/input.rb, line 128
def update_cursor_position(cursor_position)
  print IOChar.cursor_left * cursor_position
end