class Console::Format::Safe
def safe_dump_recurse(object, limit = @limit, objects = default_objects)
@parameter objects [Hash] The objects that have already been visited.
@parameter limit [Integer] The maximum depth to recurse into objects.
@parameter object [Object] The object to dump.
This will recursively generate a safe version of the object. Nested hashes and arrays will be transformed recursively. Strings will be encoded with the given encoding. Primitive values will be returned as-is. Other values will be converted using `as_json` if available, otherwise `to_s`.
def safe_dump_recurse(object, limit = @limit, objects = default_objects) if limit <= 0 || objects[object] return replacement_for(object) end case object when Hash objects[object] = true object.to_h do |key, value| [ String(key).encode(@encoding, invalid: :replace, undef: :replace), safe_dump_recurse(value, limit - 1, objects) ] end when Array objects[object] = true object.map do |value| safe_dump_recurse(value, limit - 1, objects) end when String object.encode(@encoding, invalid: :replace, undef: :replace) when Numeric, TrueClass, FalseClass, NilClass object else objects[object] = true # We could do something like this but the chance `as_json` will blow up. # We'd need to be extremely careful about it. # if object.respond_to?(:as_json) # safe_dump_recurse(object.as_json, limit - 1, objects) # else safe_dump_recurse(object.to_s, limit - 1, objects) end end