Sha256: 28e8f3be504fb4a2af21189130d0f0304d5f7a061026ff3ba03655f115af0ed8

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

require "optparse"

module CLI
  # An App
  class App
    attr_accessor :binary, :name, :version
    attr_reader :proxy, :args, :opts, :options

    def initialize(binary, &block)
      @binary = binary
      @name = binary
      @actions = {}
      @proxy = Proxy.new(self)
      @args = []
      @opts = OptionParser.new
      @options = {}
      proxy.instance_eval &block
    end

    # Hash of action_name => block to be executed
    def actions
      @actions
    end

    # Defines an action
    def action(name, &block)
      @actions[name] = block
    end

    # Runs an action
    def run(action_name)
      block = @actions[action_name]

      unless block
        raise ArgumentError, "action '#{action_name}' not found"
      end

      instance_eval &block
    end

    # Parses the arguments (with OptionParser) and runs
    # specified or default action.
    def run!(args)
      @opts.parse!(args)
      @args = args

      begin
        if args == []
          run "default"
        else
          run args[0]
        end
      rescue => e
        puts e.message.capitalize
      end
    end
  end

  # Proxy class is responsible for cool DSL inside CLI.app do ... end block
  class Proxy
    attr_reader :app

    def initialize(app)
      @app = app
    end

    # Sets the App name
    def name(val)
      app.name = val
    end

    # Sets the App version
    def version(val)
      app.version = val
    end

    # Defines the default action
    def default(&block)
      app.action("default", &block)
    end

    # Define option for OptionParser
    def option(*args, &block)
      app.opts.on(*args, &block)
    end

    # Delegates to App
    def method_missing(name, *attrs, &block)
      app.send(name, *attrs, &block)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wojtekmach-cli-0.1.0 lib/cli/app.rb