class Appsignal::EventFormatter

@api private
argument if you need to use helper methods.
So only keep global configuration as state and pass the payload around as an
event, the same object will be called intermittently in a threaded environment.
When implementing a formatter remember that it cannot keep separate state per
and body.
and implement a format(payload) method which returns an array with the title
the title and body of an event. Formatters should inherit from this class
Keeps track of formatters for types event that we can use to get

def deprecated_formatter_classes

def deprecated_formatter_classes
  @@deprecated_formatter_classes ||= {}
end

def format(name, payload)

def format(name, payload)
  formatter = formatters[name]
  formatter.format(payload) unless formatter.nil?
end

def formatter_classes

def formatter_classes
  @@formatter_classes ||= {}
end

def formatters

def formatters
  @@formatters ||= {}
end

def initialize_deprecated_formatters

def initialize_deprecated_formatters
  deprecated_formatter_classes.each do |name, formatter|
    register(name, formatter)
  end
end

def initialize_formatter(name, formatter)

def initialize_formatter(name, formatter)
  format_method = formatter.instance_method(:format)
  if !format_method || format_method.arity != 1
    raise "#{formatter} does not have a format(payload) method"
  end
  formatter_classes[name] = formatter
  formatters[name] = formatter.new
rescue => ex
  formatter_classes.delete(name)
  formatters.delete(name)
  logger.error("'#{ex.message}' when initializing #{name} event formatter")
end

def logger

def logger
  Appsignal.logger
end

def register(name, formatter = nil)

def register(name, formatter = nil)
  unless formatter
    register_deprecated_formatter(name)
    return
  end
  if registered?(name, formatter)
    logger.warn(
      "Formatter for '#{name}' already registered, not registering "\
      "'#{formatter.name}'"
    )
    return
  end
  initialize_formatter name, formatter
end

def register_deprecated_formatter(name)

def register_deprecated_formatter(name)
  deprecation_message \
    "Formatter for '#{name}' is using a deprecated registration " \
    "method. This event formatter will not be loaded. " \
    "Please update the formatter according to the documentation at: " \
    "https://docs.appsignal.com/ruby/instrumentation/event-formatters.html",
    logger
  deprecated_formatter_classes[name] = self
end

def registered?(name, klass = nil)

def registered?(name, klass = nil)
  if klass
    formatter_classes[name] == klass
  else
    formatter_classes.include?(name)
  end
end

def unregister(name, formatter = self)

def unregister(name, formatter = self)
  return unless formatter_classes[name] == formatter
  formatter_classes.delete(name)
  formatters.delete(name)
end