Sha256: 471d3a8d245512ad9f11d0b7f623c9c71de45ccd95fcc79cca73290a9d28b155

Contents?: true

Size: 1.11 KB

Versions: 1

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literals: true

require "set"

module Lumberjack
  class Formatter
    # Dereference arrays and hashes and recursively call formatters on each element.
    class StructuredFormatter
      def initialize(formatter = nil)
        @formatter = formatter
      end

      def call(obj)
        call_with_references(obj, Set.new)
      end

      private

      def call_with_references(obj, references)
        references << obj
        if obj.is_a?(Hash)
          hash = {}
          obj.each do |name, value|
            next if references.include?(value)
            references << value
            hash[name.to_s] = call_with_references(value, references)
          end
          hash
        elsif obj.is_a?(Enumerable) && obj.respond_to?(:size) && obj.size != Float::INFINITY
          array = []
          obj.each do |value|
            next if references.include?(value)
            references << value
            array << call_with_references(value, references)
          end
          array
        elsif @formatter
          @formatter.format(obj)
        else
          obj
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lumberjack-1.2.2 lib/lumberjack/formatter/structured_formatter.rb