class Tengine::Support::Config::Definition::OptparseVisitor

Attributes

o[R]
option_parser[R]

Public Class Methods

new(suite) click to toggle source
# File lib/tengine/support/config/definition/optparse_visitor.rb, line 8
def initialize(suite)
  @option_parser = OptionParser.new
  @suite = suite
end

Public Instance Methods

visit(d) click to toggle source
# File lib/tengine/support/config/definition/optparse_visitor.rb, line 15
def visit(d)
  return if d.respond_to?(:hidden?) && d.hidden?
  case d
  when Tengine::Support::Config::Definition::Suite then
    option_parser.banner = d.banner
    d.children.each{|child| child.accept_visitor(self)}
  when Tengine::Support::Config::Definition::Group then
    if d.children.any?{|c| c.is_a?(Tengine::Support::Config::Definition::Field)}
      o.separator ""
      o.separator "#{d.__name__}:"
    end
    d.children.each{|child| child.accept_visitor(self)}
  when Tengine::Support::Config::Definition then
    o.separator ""
    o.separator "#{d.__name__}:"
    d.children.each{|child| child.accept_visitor(self)}
  when Tengine::Support::Config::Definition::Field then
    desc = d.description_value
    desc_str  = desc.respond_to?(:call) ? desc.call : desc
    long_opt = d.long_opt
    args = [d.short_opt, long_opt, desc_str].compact
    case d.__type__
    when :action then
      obj = eval("self", d.__block__.binding)
      (class << obj; self; end).module_eval do
        attr_accessor :option_parser
      end
      obj.option_parser = option_parser
      o.on(*args, &d.__block__)
    when :separator then
      o.separator(d.description)
    else
      case d.type
      when :boolean then
        o.on(*args){d.__parent__.send("#{d.__name__}=", true)}
      when :load_config then
        long_opt << "=VAL"
        o.on(*args){|f| d.__parent__.send("#{d.__name__}=", f) }
      else
        long_opt << "=VAL"
        if d.enum
          desc_str << " must be one of " << (d.enum.join(',').gsub(/\A\[|\]\Z/, ''))
        end
        if default_value = d.default_value
          desc_str << " default: #{default_value.inspect}"
        end
        o.on(*args){|val| d.__parent__.send("#{d.__name__}=", val)}
      end
    end
  else
    raise "Unsupported definition class #{d.class.name}"
  end

end