52 lines
1.3 KiB
Ruby
52 lines
1.3 KiB
Ruby
require_relative '../dencli'
|
|
|
|
class DenCli::CMD
|
|
attr_reader :parent, :name, :description, :exe, :completion, :arguments
|
|
|
|
def initialize parent, name, description, exe
|
|
raise "Proc expected, instead of: #{exe.inspect}" unless Proc === exe
|
|
@parent, @name, @description, @exe = parent, name, description, exe
|
|
@arguments = []
|
|
completion {|*a| [] }
|
|
end
|
|
|
|
def _full_cmd( post) parent._full_cmd [@name]+post end
|
|
def full_cmd() _full_cmd [] end
|
|
def call( *as)
|
|
if @arguments.empty?
|
|
@exe.call *as
|
|
else
|
|
os = {}
|
|
options = OptionParser.new
|
|
options.banner = "#{full_cmd.join ' '}"
|
|
@arguments.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
|
|
@exe.call *as, **os
|
|
end
|
|
end
|
|
def help() "#{parent.full_cmd.join ' '} #{name}\n#{description}" end
|
|
|
|
def complete( *pre, str) @completion.call *pre, str end
|
|
|
|
def completion &exe
|
|
@completion = exe
|
|
self
|
|
end
|
|
|
|
def arg name, *as, **os, &exe
|
|
@arguments.push [name.to_s.to_sym, as, os, exe || lambda{|*a|a} ]
|
|
self
|
|
end
|
|
|
|
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
|
|
end
|