Search code examples
rubyoptparseoptionparser

Using ruby's OptionParser to parse sub-commands


I'd like to be able to use ruby's OptionParser to parse sub-commands of the form

COMMAND [GLOBAL FLAGS] [SUB-COMMAND [SUB-COMMAND FLAGS]]

like:

git branch -a
gem list foo

I know I could switch to a different option parser library (like Trollop), but I'm interested in learning how to do this from within OptionParser, since I'd like to learn the library better.

Any tips?


Solution

  • Figured it out. I need to use OptionParser#order!. It will parse all the options from the start of ARGV until it finds a non-option (that isn't an option argument), removing everything it processes from ARGV, and then it will quit.

    So I just need to do something like:

    global = OptionParser.new do |opts|
      # ...
    end
    subcommands = { 
      'foo' => OptionParser.new do |opts|
         # ...
       end,
       # ...
       'baz' => OptionParser.new do |opts|
         # ...
       end
     }
    
     global.order!
     subcommands[ARGV.shift].order!