leejarvis / slop

Simple Lightweight Option Parsing - ✨ new contributors welcome ✨
MIT License
1.13k stars 70 forks source link

Support for command in v4 #246

Closed paul-mesnilgrente closed 4 years ago

paul-mesnilgrente commented 4 years ago

I see in the README that there is no support for git-like commands. Is there any plans for it in the future? I'd really like to find a slop equivalent: an argument parser only!

All the libraries like thor, gli or all the others don't give you data outside of their object which is very annoying because it makes you dependent or their architecture.

Do you have any suggestions for a slop-like gem with subcommands?

leejarvis commented 4 years ago

There are no plans to add a command system back into Slop. I think the requirements for these sort of things are just too broad, so you end up either having to decide a lot of things for the end user, or create a mish-mash of all possibilities that becomes difficult to maintain.

I think the best thing to do is build something custom that does exactly what you want. Here's a starting point:

require "slop"

class Commands
  attr_reader :commands, :global

  def initialize(&block)
    @commands = {}
    @global = Slop::Options.new(&block)
  end

  def add(command, &block)
    @commands[command] ||= Slop::Options.new(&block)
  end

  def run(args)
    arg = args.first

    if options = commands[arg]
      Slop::Parser.new(options).parse(args[1..-1])
    else
      Slop::Parser.new(global).parse(args)
    end
  end
end

commands = Commands.new do |opts|
  opts.on "-v", "Print version" do
    puts "version ..."
  end
end

commands.add("log") do |opts|
  opts.on "-v", "Override global" do
    p "in log command"
  end
end

commands.run ARGV.dup

Check out the Advanced Usage section of the README and the documentation for Slop::Result which includes methods for extracting unused flags and arguments so you can create commands that pull out options from the argument list and then move on to another parser if you'd like.