module Fluent::PluginHelper::Parser
def parser_create(usage: '', type: nil, conf: nil, default_type: nil)
def parser_create(usage: '', type: nil, conf: nil, default_type: nil) parser = @_parsers[usage] return parser if parser && !type && !conf type = if type type elsif conf && conf.respond_to?(:[]) raise Fluent::ConfigError, "@type is required in <parse>" unless conf['@type'] conf['@type'] elsif default_type default_type else raise ArgumentError, "BUG: both type and conf are not specified" end parser = Fluent::Plugin.new_parser(type, parent: self) config = case conf when Fluent::Config::Element conf when Hash # in code, programmer may use symbols as keys, but Element needs strings conf = Hash[conf.map{|k,v| [k.to_s, v]}] Fluent::Config::Element.new('parse', usage, conf, []) when nil Fluent::Config::Element.new('parse', usage, {}, []) else raise ArgumentError, "BUG: conf must be a Element, Hash (or unspecified), but '#{conf.class}'" end parser.configure(config) if @_parsers_started parser.start end @_parsers[usage] = parser parser end