diff options
Diffstat (limited to 'examples/basic_usage.rb')
-rw-r--r-- | examples/basic_usage.rb | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/examples/basic_usage.rb b/examples/basic_usage.rb index 62e3ccb..c97b89f 100644 --- a/examples/basic_usage.rb +++ b/examples/basic_usage.rb @@ -1,4 +1,5 @@ #!/usr/bin/env ruby +# encoding: utf-8 # basic_usage.rb # @@ -12,32 +13,35 @@ require "yaml" puts "Using: #{HighLine.default_instance.terminal.class}" puts -contacts = [ ] +contacts = [] +# Just define a parse class method and use the class +# as a parser for HighLine#ask +# class NameClass - def self.parse( string ) - if string =~ /^\s*(\w+),\s*(\w+)\s*$/ - self.new($2, $1) - else - raise ArgumentError, "Invalid name format." - end + def self.parse(string) + raise ArgumentError, "Invalid name format." unless + string =~ /^\s*(\w+),\s*(\w+)\s*$/ + + new(Regexp.last_match(2), Regexp.last_match(1)) end def initialize(first, last) - @first, @last = first, last + @first = first + @last = last end attr_reader :first, :last end -begin - entry = Hash.new +loop do + entry = {} # basic output say("Enter a contact:") # basic input - entry[:name] = ask("Name? (last, first) ", NameClass) do |q| + entry[:name] = ask("Name? (last, first) ", NameClass) do |q| q.validate = /\A\w+, ?\w+\Z/ end entry[:company] = ask("Company? ") { |q| q.default = "none" } @@ -47,27 +51,30 @@ begin q.case = :up q.validate = /\A[A-Z]{2}\Z/ end - entry[:zip] = ask("Zip? ") do |q| + entry[:zip] = ask("Zip? ") do |q| q.validate = /\A\d{5}(?:-?\d{4})?\Z/ end - entry[:phone] = ask( "Phone? ", - lambda { |p| p.delete("^0-9"). - sub(/\A(\d{3})/, '(\1) '). - sub(/(\d{4})\Z/, '-\1') } ) do |q| - q.validate = lambda { |p| p.delete("^0-9").length == 10 } + entry[:phone] = ask("Phone? ", + lambda { |p| + p.delete("^0-9"). + sub(/\A(\d{3})/, '(\1) '). + sub(/(\d{4})\Z/, '-\1') + }) do |q| + q.validate = ->(p) { p.delete("^0-9").length == 10 } q.responses[:not_valid] = "Enter a phone numer with area code." end entry[:age] = ask("Age? ", Integer) { |q| q.in = 0..105 } entry[:birthday] = ask("Birthday? ", Date) - entry[:interests] = ask( "Interests? (comma separated list) ", - lambda { |str| str.split(/,\s*/) } ) + entry[:interests] = ask("Interests? (comma separated list) ", + ->(str) { str.split(/,\s*/) }) entry[:description] = ask("Enter a description for this contact.") do |q| q.whitespace = :strip_and_collapse end contacts << entry -# shortcut for yes and no questions -end while agree("Enter another contact? ", true) + # shortcut for yes and no questions + break unless agree("Enter another contact? ", true) +end if agree("Save these contacts? ", true) file_name = ask("Enter a file name: ") do |q| |