Class: Input

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/simple_prompt/input.rb

Overview

  1. 本体

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

Constructor Details

#initializeInput

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_inputObject



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

#runObject



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