この記事はソニックガーデン プログラマ アドベントカレンダーの22日目の記事です。
はじめに
Rubyでスクリプト実行時に、途中でユーザの入力を求めたいシーンは多々ありますよね。
そんなときに gets.chomp
などで文字列入力を求める方法がパッと思いつきます。
例えばこんな感じ。
puts "名前を入力してください"
name = gets.chomp
ですが、毎回文字列入力を求めるのはちょっとダサいですよね。
そんなときに便利なのが、今回お伝えする tty-prompt
というGemです。
tty-prompt の使い方
Gem をインストール
gem install tty-prompt
あとは下記のようなコードを書いて実行するだけです。
require 'tty-prompt'
prompt = TTY::Prompt.new(prefix: '[?] ', active_color: :cyan)
# テキスト入力してもらう
reason = prompt.ask("なぜこのスクリプトを実行するのですか?")
# YES/NOで選んでもらう
if prompt.no?('ステージング環境で動作確認しましたか?')
prompt.error '必ずステージング環境でリハーサルしてください!'
exit
end
# 複数選択肢から選ぶ
partners = prompt.multi_select('ペアオペレーションの相手は?', %w[太郎 次郎 三郎])
# 選択肢から選ぶ
container_size = prompt.select('実行するコンテナのサイズは?', %w[small medium large xlarge])
# スライダーで選択
minutes = prompt.slider('処理時間(分)の想定は?',
max: 60,
default: 5,
step: 5,
help: "左右の矢印キーで値を変更できます",
show_help: :always)
# 入力した情報の確認
prompt.ok "[Summary] #{minutes}分かかる想定の処理を#{container_size}のコンテナで#{partners.join(',')}と実施します"
上記のコードを実行するとこのようにスタイリッシュな入力プロンプトが出来上がります。
警告は赤色、インフォメーションは緑色で目立たせたりすることも簡単にできますね。
公式ドキュメント
サンプルで紹介していないですが、他にも複数行入力やマスク入力などさまざまなものに対応しています。
このREADMEを眺めてみるだけで、すぐに理解できるくらいサンプルも充実しています。
まとめ
今回ご紹介したサンプルでは、選択肢は固定していましたが、実際に利用するときには選択肢候補を外部APIをコールして取得し、それをHashやArrayに変換した上で、選択肢として提示すると便利に使えるようになるかと思います。
ぜひお試しあれ!