lib/tty/prompt/answers_collector.rb
# frozen_string_literal: true
module TTY
class Prompt
class AnswersCollector
# Initialize answer collector
#
# @api public
def initialize(prompt, **options)
@prompt = prompt
@answers = options.fetch(:answers) { {} }
end
# Start gathering answers
#
# @return [Hash]
# the collection of all answers
#
# @api public
def call(&block)
instance_eval(&block)
@answers
end
# Create answer entry
#
# @example
# key(:name).ask("Name?")
#
# @api public
def key(name, &block)
@name = name
if block
answer = create_collector.call(&block)
add_answer(answer)
end
self
end
# Change to collect all values for a key
#
# @example
# key(:colors).values.ask("Color?")
#
# @api public
def values(&block)
@answers[@name] = Array(@answers[@name])
if block
answer = create_collector.call(&block)
add_answer(answer)
end
self
end
# @api public
def create_collector
self.class.new(@prompt)
end
# @api public
def add_answer(answer)
if @answers[@name].is_a?(Array)
@answers[@name] << answer
else
@answers[@name] = answer
end
end
private
# @api private
def method_missing(method, *args, **options, &block)
answer = @prompt.public_send(method, *args, **options, &block)
add_answer(answer)
end
end # AnswersCollector
end # Prompt
end # TTY