module Fluent::Config::SectionGenerator

Public Class Methods

generate(proxy, conf, logger, stack = []) click to toggle source
# File lib/fluent/config/section.rb, line 78
def self.generate(proxy, conf, logger, 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)
    end
    unless section_params.has_key?(varname)
      logger.error "config error in:\n#{conf}"
      raise ConfigError, "'#{name}' parameter is required" + section_stack
    end
  end

  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 }

    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, 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, stack + [subproxy.name])
    end
  end

  Section.new(section_params)
end