# -*- coding: utf-8 -*- require "readline" # module for CUI interactive interface # module Dialog PROMPT = "> " # ---------------- # Select one from the list specified by the array. def select_one( arr, message = "Input the number", default = 0) unless arr.is_a?(Array) and arr.size >= 1 and default.to_i >= 0 and default.to_i < arr.size raise ArgumentError, "Arguments are not valid." end while true $stdout.puts( "#{message} : [#{default.to_s}]") arr.size.times do |i| puts( "[#{i}]:\t#{arr[i]}") end buf = Readline.readline(PROMPT).chomp.strip buf = default.to_s if buf=='' unless buf.match(/^[0-9]+$/) $stdout.puts "The input #{buf} is not valid. Try again" redo end num = Integer(buf) if num >= 0 and num < arr.size valid_input = true return num end $stdout.puts "Your input is not valid. Try again." end end # --------------- def select_one_or_return_string( arr, message = "Input the number", default = 0) unless arr.is_a?(Array) and arr.size >= 1 raise ArgumentError, "Arguments are not valid." end while true $stdout.puts( "#{message} : [#{default.to_s}]") arr.size.times do |i| puts( "[#{i}]:\t#{arr[i]}") end buf = Readline.readline(PROMPT).chomp.strip buf = default.to_s if buf=='' if buf.match(/^[0-9]+$/) num = Integer(buf) if num >= 0 and num < arr.size valid_input = true return num end else return buf end $stdout.puts "Your input is not valid. Try again." end end # --------------- def select_many( arr, message = "Select multiple numbers (ex. 1,3,5-8)", default = 0) unless arr.is_a?(Array) and arr.size >= 1 raise ArgumentError, "Arguments are not valid." end result = [] valid_input = nil until valid_input $stdout.puts( "#{message} : [#{default}]") arr.size.times do |i| puts( "[#{i}]:\t#{arr[i]}") end buf = Readline.readline(PROMPT).chomp buf = default.to_s if buf=='' valid_input = true buf = buf.split(',').map do |e| e.strip end buf.each do |e| if e.match(/^[0-9]+$/) num = Integer(e) if num < 0 or num >= arr.size valid_input = nil break else result << num end elsif e.match(/^[0-9]+-[0-9]+$/) f = e.split('-') from = Integer(f[0]) to = Integer(f[1]) if from >= to valid_input = nil break end for i in from..to result << i if i > 0 and i <= arr.size end else valid_input = nil break end end $stdout.puts "The input #{buf} is not valid. Try again." unless valid_input end return result end # --------------- def message( str) $stdout.puts str end # --------------- def set_multiple_values( arr, message = "Input the values") unless arr.is_a?(Array) raise ArgumentError, "Arguments are not valid." end result = Hash.new arr.each do |a| unless a.is_a?(Array) and a.size == 3 raise ArgumentError, "Arguments are not valid." end key = a[0] type = a[1] val = a[2] unless ( type == Integer or type == Float or type == String ) and val.is_a?(type) raise ArgumentError, "Arguments are not valid." end result[key] = val end unless arr.size == result.size raise ArgumentError, "There is a nonunique key." end ok = nil until ok # show the list arr.each_with_index do |elem,i| $stdout.puts "[#{i}] :\t#{elem[0]}, #{elem[1]}, #{result[elem[0]]}" end $stdout.puts "[#{arr.size}] : \tOK" # input buf = Readline.readline(PROMPT).chomp.strip unless buf.match(/^[0-9]+$/) redo end input = buf.to_i if input >= 0 and input < arr.size $stdout.puts "Input #{arr[input][0]} (#{arr[input][1]})" buf = Readline.readline(PROMPT).chomp.strip if arr[input][1] == Integer begin result[ arr[input][0] ] = Integer(buf) rescue $stdout.puts "The specified value is not convertible to Integer" end elsif arr[input][1] == Float begin result[ arr[input][0] ] = Float(buf) rescue $stdout.puts "The specified value is not convertible to Float" end elsif arr[input][1] == String result[ arr[input][0] ] = buf.to_s end elsif input == arr.size ok = true end end return result end # --------------- def get_integer( message = "Input a integer", default = 0) unless default.is_a?(Integer) raise ArgumentError, "Arguments are not valid." end while true $stdout.puts( "#{message} : [#{default}]") buf = Readline.readline(PROMPT).chomp.strip buf = default.to_s if buf=='' unless buf.match(/^[0-9]+$/) $stdout.puts "The input #{buf} is not valid. Try again" redo end num = Integer(buf) if yield num return num else $stdout.puts "The input #{buf} does not match the condition. Try again" end end end # ----------------- def ask( message = "Input y or n.", default = true) while true m = "(y/N)" m = "(Y/n)" if default $stdout.puts( "#{message} : #{m}") buf = Readline.readline(PROMPT).chomp.strip.downcase if buf == '' if default return true else return false end end if buf.match(/^y$/) or buf.match(/^yes$/) return true elsif buf.match(/^n$/) or buf.match(/^no$/) return false else $stdout.puts "The input is not valid. Try again" redo end end end module_function :select_one, :select_one_or_return_string, :select_many, :message, :set_multiple_values, :get_integer, :ask end