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