class ListPicker::Picker

Public Class Methods

new(array, options = {}) click to toggle source
# File lib/list_picker.rb, line 6
def initialize(array, options = {})
        @options = {
                label_method: :to_s
                }.merge(options)

                @array = array
        end

Public Instance Methods

ask(question, &validation_block) click to toggle source
# File lib/list_picker.rb, line 14
def ask(question, &validation_block)
        puts ""
        puts "#{question}: "
        puts ""
        @array.each_with_index do |item, index|
                puts "#{(index + 1).to_s.rjust(2)}) #{item.send(@options[:label_method].to_sym)}"
        end
        puts ""
        print "> "

        default_validation_block = Proc.new do |item|
                item.to_i > 0 && item.to_i <= @array.size
        end

        if preselected_option = ARGV.shift
                input = preselected_option
        else
                input = gets.chomp
        end

        unless block_given?
                validation_block = default_validation_block
        end

        unless validation_block.call(input)
                $stderr.puts ""
                $stderr.puts "Invalid selection, please try again"
                return ask(question, &validation_block)
        end

        selected = @array[input.to_i - 1]

        puts ""
        puts "Selected item: #{selected.send(@options[:label_method].to_sym)}"
        puts ""

        return selected
end