def self.generate(proxy, conf, logger, plugin_class, stack = [])
return nil if conf.nil?
section_stack = ""
unless stack.empty?
section_stack = ", in section " + stack.join(" > ")
end
section_params = {}
proxy.defaults.each_pair do |name, defval|
varname = name.to_sym
section_params[varname] = defval
end
if proxy.argument
unless conf.arg.empty?
key, block, opts = proxy.argument
section_params[key] = self.instance_exec(conf.arg, opts, name, &block)
end
unless section_params.has_key?(proxy.argument.first)
logger.error "config error in:\n#{conf}"
raise ConfigError, "'<#{proxy.name} ARG>' section requires argument" + section_stack
end
end
proxy.params.each_pair do |name, defval|
varname = name.to_sym
block, opts = defval
if conf.has_key?(name.to_s) || opts[:alias] && conf.has_key?(opts[:alias].to_s)
val = if conf.has_key?(name.to_s)
conf[name.to_s]
else
conf[opts[:alias].to_s]
end
section_params[varname] = self.instance_exec(val, opts, name, &block)
if opts[:deprecated]
logger.warn "'#{name}' parameter is deprecated: #{opts[:deprecated]}"
end
if opts[:obsoleted]
logger.error "config error in:\n#{conf}" if logger
raise ObsoletedParameterError, "'#{name}' parameter is already removed: #{opts[:obsoleted]}" + section_stack
end
end
unless section_params.has_key?(varname)
logger.error "config error in:\n#{conf}"
raise ConfigError, "'#{name}' parameter is required" + section_stack
end
end
check_unused_section(proxy, conf, plugin_class)
proxy.sections.each do |name, subproxy|
varname = subproxy.param_name.to_sym
elements = (conf.respond_to?(:elements) ? conf.elements : []).select{ |e| e.name == subproxy.name.to_s || e.name == subproxy.alias.to_s }
elements.each { |element|
element.corresponding_proxies << subproxy
}
if subproxy.required? && elements.size < 1
logger.error "config error in:\n#{conf}"
raise ConfigError, "'<#{subproxy.name}>' sections are required" + section_stack
end
if subproxy.multi?
section_params[varname] = elements.map{ |e| generate(subproxy, e, logger, plugin_class, stack + [subproxy.name]) }
else
if elements.size > 1
logger.error "config error in:\n#{conf}"
raise ConfigError, "'<#{subproxy.name}>' section cannot be written twice or more" + section_stack
end
section_params[varname] = generate(subproxy, elements.first, logger, plugin_class, stack + [subproxy.name])
end
end
Section.new(section_params)
end