summaryrefslogtreecommitdiff
path: root/examples/custom_parser_custom_validator.rb
blob: 0744e7bd9beef3bd1f79551478a19b19517f8b21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
require 'highline'

cli = HighLine.new

# The parser
class ArrayOfNumbersFromString
  def self.parse(string)
    string.scan(/\d+/).map(&:to_i)
  end
end

# The validator
class ArrayOfNumbersFromStringInRange
  def self.in?(range)
    new(range)
  end

  attr_reader :range

  def initialize(range)
    @range = range
  end

  def valid?(answer)
    ary = ArrayOfNumbersFromString.parse(answer)
    ary.all? ->(number) { range.include? number }
  end

  def inspect
    "in range #@range validator"
  end
end

answer = cli.ask("Which number? (0 or <Enter> to skip): ", ArrayOfNumbersFromString) { |q|
  q.validate = ArrayOfNumbersFromStringInRange.in?(0..10)
  q.default = 0
}

puts "Your answer was: #{answer} and it was correctly validated and coerced into an #{answer.class}"