module SemanticLogger::Appender

def self.build(io: nil, file_name: nil, appender: nil, metric: nil, logger: nil, **args, &block)

Returns [Subscriber] instance from the supplied options.
def self.build(io: nil, file_name: nil, appender: nil, metric: nil, logger: nil, **args, &block)
  if file_name
    SemanticLogger::Appender::File.new(file_name, **args, &block)
  elsif io
    SemanticLogger::Appender::IO.new(io, **args, &block)
  elsif logger
    SemanticLogger::Appender::Wrapper.new(logger: logger, **args, &block)
  elsif appender
    if appender.is_a?(Symbol)
      SemanticLogger::Utils.constantize_symbol(appender).new(**args)
    elsif appender.is_a?(Subscriber)
      appender
    else
      raise(ArgumentError,
            "Parameter :appender must be either a Symbol or an object derived from SemanticLogger::Subscriber, not: #{appender.inspect}")
    end
  elsif metric
    if metric.is_a?(Symbol)
      SemanticLogger::Utils.constantize_symbol(metric, "SemanticLogger::Metric").new(**args)
    elsif metric.is_a?(Subscriber)
      metric
    else
      raise(ArgumentError,
            "Parameter :metric must be either a Symbol or an object derived from SemanticLogger::Subscriber, not: #{appender.inspect}")
    end
  else
    raise(ArgumentError,
          "To create an appender it must supply one of the following: :io, :file_name, :appender, :metric, or :logger")
  end
end