Search code examples
rubyrubygemscommand-line-interfacehighline

Ruby highline gem: Is there a way to assign a command for the duration of the script/app


I have gem/cli that uses highline and I was wondering if you can set your own command so it is always available (similar to 'help').

require 'rubygems'
require 'highline/import'

say("\nThis is the new mode (default)...")
choose do |menu|
  menu.prompt = "Please choose your favorite programming language?  "

  menu.choice :ruby do say("Good choice!") end
  menu.choices(:python, :perl) do say("Not from around here, are you?") end
end

say("\nThis is letter indexing...")
choose do |menu|
  menu.index        = :letter
  menu.index_suffix = ") "

  menu.prompt = "Please choose your favorite programming language?  "

  menu.choice :ruby do say("Good choice!") end
  menu.choices(:python, :perl) do say("Not from around here, are you?") end
end

say("\nThis is with a different layout...")
choose do |menu|
  menu.layout = :one_line

  menu.header = "Languages"
  menu.prompt = "Favorite?  "

  menu.choice :ruby do say("Good choice!") end
  menu.choices(:python, :perl) do say("Not from around here, are you?") end
end

thanks!


Solution

  • I think this is only possible with rather spooky monkey-patching of the highline gem, except you want to add your commands to every choice (What is your favorite programming language? 1. ruby 2. perl 3. help 4. menu 5. quit...), which you could extract to do in a method like:

    def add_custom_choices(menu)
      menu.choice(:quit) do
        say "Ok, see you."
        exit 0
      end
      menu.choice(:dostuff) do call_do_stuff_method end
    end
    
    
    # and later ...
    choose do |menu|
      # ...
      menu.choice :ruby do say("Good choice!") end
      add_custom_choices menu
      # ....
    end