Class: Input
Overview
-
本体
Constant Summary collapse
- ValidatorProc =
T.type_alias { T.proc.params(arg0: String).returns(T.nilable(String)) }
- ValidatorType =
T.type_alias { T.any(Symbol, ValidatorProc) }
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize ⇒ Input
constructor
A new instance of Input.
- #prompt(text) ⇒ Object
- #run ⇒ Object
- #title(text) ⇒ Object
- #validate(validator = nil, &block) ⇒ Object
- #with_validators(provider) ⇒ Object
Constructor Details
#initialize ⇒ Input
Returns a new instance of Input.
20 21 22 23 24 25 26 27 |
# File 'lib/simple_prompt/input.rb', line 20 def initialize @reader = T.let($stdin, T.any(IO, StringIO)) @writer = T.let($stdout, T.any(IO, StringIO)) @title = T.let('', String) @prompt = T.let('> ', String) @validators = T.let([], T::Array[ValidatorProc]) @validator_provider = T.let(DefaultValidators, T.untyped) end |
Class Method Details
.new_input ⇒ Object
15 |
# File 'lib/simple_prompt/input.rb', line 15 def self.new_input; new; end |
Instance Method Details
#prompt(text) ⇒ Object
33 |
# File 'lib/simple_prompt/input.rb', line 33 def prompt(text); @prompt = text; self; end |
#run ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/simple_prompt/input.rb', line 55 def run loop do @writer.puts "\e[1m#{@title}\e[0m" unless @title.empty? @writer.print @prompt input_data = @reader.gets return '' if input_data.nil? # Ctrl-D val = input_data.chomp.strip error = T.let(nil, T.nilable(String)) @validators.each { |v| break if (error = v.call(val)) } return val unless error # 視認性のための余白 @writer.puts '' @writer.puts "\e[31m! #{error}\e[0m" @writer.puts '' end rescue Interrupt # Ctrl-C @writer.puts "\n\e[2m(canceled)\e[0m" exit 0 end |
#title(text) ⇒ Object
30 |
# File 'lib/simple_prompt/input.rb', line 30 def title(text); @title = text; self; end |
#validate(validator = nil, &block) ⇒ Object
39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/simple_prompt/input.rb', line 39 def validate(validator = nil, &block) if block @validators << block elsif validator.is_a?(Proc) @validators << validator elsif validator.is_a?(Symbol) unless @validator_provider.respond_to?(validator) raise ArgumentError, "Unknown validator :#{validator} in #{@validator_provider}" end @validators << @validator_provider.method(validator).to_proc end self end |
#with_validators(provider) ⇒ Object
36 |
# File 'lib/simple_prompt/input.rb', line 36 def with_validators(provider); @validator_provider = provider; self; end |