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 |