File: answers_collector.rb

package info (click to toggle)
ruby-tty-prompt 0.23.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 1,452 kB
  • sloc: ruby: 8,847; makefile: 4
file content (78 lines) | stat: -rw-r--r-- 1,672 bytes parent folder | download
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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