Sha256: 333d60c81d1d464a5d508f12984d4f580e09a101f9bfa1120ddbee9ae36a5a65

Contents?: true

Size: 1.64 KB

Versions: 16

Compression:

Stored size: 1.64 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
      class RecusiveReferenceError < StandardError
      end

      def initialize(formatter = nil)
        @formatter = formatter
      end

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

      private

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

      def with_object_reference(obj, references)
        if obj.is_a?(Enumerable)
          return RecusiveReferenceError.new if references.include?(obj.object_id)
          references << obj.object_id
          begin
            yield
          ensure
            references.delete(obj.object_id)
          end
        else
          yield
        end
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 3 rubygems

Version Path
op_connect-0.1.2 vendor/bundle/ruby/3.1.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.35 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.34 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.33 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.32 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.31 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.30 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.29 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.28 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.27 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.26 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
qiita_org-0.1.25 gems/ruby/2.7.0/gems/lumberjack-1.2.8/lib/lumberjack/formatter/structured_formatter.rb
lumberjack-1.2.8 lib/lumberjack/formatter/structured_formatter.rb
lumberjack-1.2.7 lib/lumberjack/formatter/structured_formatter.rb
lumberjack-1.2.6 lib/lumberjack/formatter/structured_formatter.rb
lumberjack-1.2.5 lib/lumberjack/formatter/structured_formatter.rb