class Safe
This class is used to safely dump objects. It will attempt to dump the object using the given format, but if it fails, it will generate a safe version of the object.
Definitions
def safe_dump_recurse(object, limit = @limit, objects = default_objects)
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
.
Implementation
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