Sha256: 03877e3eca590aed6b12fe737705210f3ade8ed89a05d98ae4464294b7219e85
Contents?: true
Size: 1.71 KB
Versions: 1
Compression:
Stored size: 1.71 KB
Contents
require "menuboy/version" module Menuboy module DSL def option name, &block opt_count = @target.options.count key = (opt_count+1).to_s if key.size > 1 raise StandardError, "You can only define 9 options per menu" end opt = Option.new(key, name, block) @target.options.push opt end def submenu name="Submenu" option(name) do @target = Menu.new(name) yield @target.start end end def mainmenu(name="Main menu") if @mainmenu raise StandardError, "You can only define one main menu" else @mainmenu = Menu.new(name) @target = @mainmenu yield @mainmenu.start end end end class Option < Struct.new(:key, :name, :proc) end class Menu include DSL attr_accessor :name, :options CTRL_C = "\u0003" def initialize name self.name = name self.options = [] end def print_help self.options.each do |opt| puts "#{opt.key} - #{opt.name}" end puts "p - jump into a Pry repl" if defined? Pry puts "q - quit / go back" end def option_match? input matches = self.options.select{|o| o.key == input} matches.length == 1 ? matches.last : false end def start print_help loop do print "(#{@name})> " input = STDIN.getch puts input if input == CTRL_C || input == "q" break elsif input == "h" print_help elsif input == "p" && defined? Pry binding.pry elsif option = option_match?(input) option.proc.call else puts "Unassigned input" end end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
menuboy-0.0.1 | lib/menuboy.rb |