module RCoLi::CommandContainer

Attributes

parent[RW]

Public Instance Methods

action(&block) click to toggle source
# File lib/rcoli/model.rb, line 17
def action(&block)
  @action = block
end
command(nam, &block) click to toggle source
# File lib/rcoli/model.rb, line 25
def command(nam, &block)
  obj = Command.new(nam)
  obj.parent = self
  block.call(obj)  
  commands << obj
end
commands() click to toggle source
# File lib/rcoli/model.rb, line 32
def commands
  (@commands ||= [])
end
find_command(name) click to toggle source
# File lib/rcoli/model.rb, line 88
def find_command(name)
  result = commands.find{|command| command.value_of_name.to_s.eql? name}
  return result
end
flag(names, &block) click to toggle source
# File lib/rcoli/model.rb, line 46
def flag(names, &block)
  obj = Flag.new(names)
  block.call(obj) if block_given? 
  options << obj
end
get_action() click to toggle source
# File lib/rcoli/model.rb, line 21
def get_action
  @action
end
options() click to toggle source
# File lib/rcoli/model.rb, line 36
def options
  (@options ||= [])
end
parse_args(args, result) click to toggle source
# File lib/rcoli/model.rb, line 52
def parse_args(args, result)
  return if args.empty?
  arg = args.delete_at(0)
  if (is_option? arg)
    if (option = find_option(arg))
      if (option.is_a? Flag)
        raise InvalidCommand, "Flag #{arg} is missing a value" if args.empty?
        value = args.delete_at(0)
      else
        value = true
      end
      option.keys.each{|key| result.options[key] = value}
    else
      raise InvalidCommand, "'#{arg}' is not a valid option"
    end
  else
    if (cmd = find_command(arg))
      result.command = cmd
      cmd.put_default_values(result)
      cmd.parse_args(args, result)
      cmd.validate_options(result)
    elsif (commands.empty?)
      result.arguments << arg
    else
      raise InvalidCommand, "'#{arg}' is not a valid #{@name} command"
    end
  end
  parse_args(args, result)
end
put_default_values(result) click to toggle source
# File lib/rcoli/model.rb, line 82
def put_default_values(result)
  options.find_all{|option| option.respond_to? :value_of_default_value and option.value_of_default_value}.each do |option|
    option.keys.each{|key| result.options[key] = option.value_of_default_value}
  end
end
switch(names, &block) click to toggle source
# File lib/rcoli/model.rb, line 40
def switch(names, &block)
  obj = Switch.new(names)
  block.call(obj) if block_given?  
  options << obj
end
validate_options(result) click to toggle source
# File lib/rcoli/model.rb, line 93
def validate_options(result)
  if (result.command.nil? or result.command.value_of_force == true)
    return
  else
    self.options.find_all{|o| o.is_a? Flag and o.value_of_required}.each do |o|
      raise InvalidCommand, "Required option '#{o.to_s}' is missing" unless o.keys.find{|key| result.options[key]}
    end
  end
end

Private Instance Methods

find_option(name) click to toggle source
# File lib/rcoli/model.rb, line 105
def find_option(name)
  all_options = []
  command = self
  begin
    all_options.concat(command.options)
    command = command.parent
  end while(command)
  all_options.find{|opt| opt.correspond?(name)}
end
is_option?(value) click to toggle source
# File lib/rcoli/model.rb, line 115
def is_option?(value)
  value.start_with?('-')
end