Sha256: 68d9ea30dbc086b4c3ba065bb5944b6df2a508b45043f5130b1215d7ea2dc04c

Contents?: true

Size: 1.48 KB

Versions: 10

Compression:

Stored size: 1.48 KB

Contents

# typed: ignore

# Copyright (c) 2015 Sqreen. All Rights Reserved.
# Please refer to our terms for more information: https://www.sqreen.com/terms.html

module Sqreen
  # Serialization functions: convert Hash -> simple ruby types
  module Serializer
    # Serialize a deep hash/array to more simple types
    def self.serialize(obj, max_depth = 10)
      if obj.is_a?(Array)
        new_obj = []
        i = -1
        to_do = obj.map { |v| [new_obj, i += 1, v, 0] }
      else
        new_obj = {}
        to_do = obj.map { |k, v| [new_obj, k, v, 0] }
      end
      until to_do.empty?
        where, key, value, deepness = to_do.pop
        safe_key = key.kind_of?(Integer) ? key : key.to_s
        if value.is_a?(Hash) && deepness < max_depth
          where[safe_key] = {}
          to_do += value.map { |k, v| [where[safe_key], k, v, deepness + 1] }
        elsif value.is_a?(Array) && deepness < max_depth
          where[safe_key] = []
          i = -1
          to_do += value.map { |v| [where[safe_key], i += 1, v, deepness + 1] }
        else
          case value
          when Symbol
            where[safe_key] = value.to_s
          when Rational
            where[safe_key] = value.to_f
          when Time
            where[safe_key] = value.iso8601
          when Numeric, String, TrueClass, FalseClass, NilClass
            where[safe_key] = value
          else
            where[safe_key] = "#{value.class.name}:#{value.inspect}"
          end
        end
      end

      new_obj
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
sqreen-1.25.1 lib/sqreen/serializer.rb
sqreen-1.25.0 lib/sqreen/serializer.rb
sqreen-1.24.3 lib/sqreen/serializer.rb
sqreen-1.24.2 lib/sqreen/serializer.rb
sqreen-1.24.1 lib/sqreen/serializer.rb
sqreen-1.24.0 lib/sqreen/serializer.rb
sqreen-1.23.2 lib/sqreen/serializer.rb
sqreen-1.23.1 lib/sqreen/serializer.rb
sqreen-1.23.0 lib/sqreen/serializer.rb
sqreen-1.22.1 lib/sqreen/serializer.rb