class DenCli::CMD

Attributes

completion[R]
description[R]
exe[R]
name[R]
options[R]
parent[R]

Public Class Methods

new(parent, name, description, exe) click to toggle source
# File lib/dencli/cmd.rb, line 6
def initialize parent, name, description, exe
        raise "Proc expected, instead of: #{exe.inspect}"  unless Proc === exe
        @parent, @name, @description, @exe = parent, name, description, lambda( &exe)
        @options = []
        completion {|*a| [] }
end

Public Instance Methods

_full_cmd( post) click to toggle source
# File lib/dencli/cmd.rb, line 13
def _full_cmd( post) parent._full_cmd [@name]+post end
additional() click to toggle source
# File lib/dencli/cmd.rb, line 18
def additional() @exe.parameters.select{|e|:opt == e[0]}.map{|e|e[1]} end
call( *as) click to toggle source
# File lib/dencli/cmd.rb, line 20
def call( *as)
        if @options.empty?
                @exe.call *as
        else
                os = {}
                options = OptionParser.new
                options.banner = "#{full_cmd.join ' '}"
                @options.each do |(aname, aas, aos, aexe)|
                        os[aname] = aos[aname]  if aos.has_key? :default
                        options.on( *aas) {|val| os[aname] = aexe[val] }
                end
                as = options.parse! as
                if @exe.lambda?
                        pars = required
                        if as.length < pars.length
                                raise DenCli::UsageError, "Missing parameter(s): #{pars[as.length..-1].join " "}"
                        end
                        if parameters.select{|e|:rest == e[0]}.empty?
                                pars = pars + additional
                                if as.length > pars.length
                                        raise DenCli::UsageError, "Unused parameter(s): #{as[-pars.length..-1].shelljoin}"
                                end
                        end
                end
                @exe.call *as, **os
        end
end
complete( *pre, str) click to toggle source
# File lib/dencli/cmd.rb, line 61
def complete( *pre, str) @completion.call *pre, str end
full_cmd() click to toggle source
# File lib/dencli/cmd.rb, line 14
def full_cmd() _full_cmd [] end
help() click to toggle source
# File lib/dencli/cmd.rb, line 57
def help
        "#{usage}\n#{description}"
end
inspect() click to toggle source
# File lib/dencli/cmd.rb, line 73
def inspect
        "#<%s:0x%x %s @name=%p @description=%p @parent=<%s:0x%x %s> @exe=<arity=%d>>" % [
                self.class.name, self.object_id, self.full_cmd,
                @name, @description, @parent.class.name, @parent.class.object_id, @parent.full_cmd,
                @exe.arity
        ]
end
opt(name, *as, **os, &exe) click to toggle source
# File lib/dencli/cmd.rb, line 68
def opt name, *as, **os, &exe
        @options.push [name.to_s.to_sym, as, os, exe || lambda{|val|val} ]
        self
end
parameters() click to toggle source
# File lib/dencli/cmd.rb, line 16
def parameters() @exe.parameters end
required() click to toggle source
# File lib/dencli/cmd.rb, line 17
def required() @exe.parameters.select{|e|:req == e[0]}.map{|e|e[1]} end
usage() click to toggle source
# File lib/dencli/cmd.rb, line 48
def usage
        "#{parent.full_cmd.join ' '} #{name} "+
                @options.map{|(_,(o,_,_,_),_)|"[#{o}] "}.join( '')+
                (@exe.lambda? ? (
                        required.join( " ")+
                        (additional.empty? ? "" : " [#{additional.join " "}]")
                ) : '...')
end