From 7f6ad7937c3add5877a2b1acaa0c6694ec9b3645 Mon Sep 17 00:00:00 2001 From: Christian Rorvik Date: Sat, 31 May 2025 21:02:56 +0200 Subject: [PATCH] Writer skipnull option --- src/writer.jl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/writer.jl b/src/writer.jl index 4f7bbac..5f9ed3f 100644 --- a/src/writer.jl +++ b/src/writer.jl @@ -2,14 +2,16 @@ struct BSONWriter{D <: DenseVector{UInt8}, C <: BSONConversionRules} dst::D offset::Int conversions::C + skipnull::Bool function BSONWriter( dst::D; - conversions::C = DefaultBSONConversions() + conversions::C = DefaultBSONConversions(), + skipnull::Bool = false, ) where {D <: DenseVector{UInt8}, C <: BSONConversionRules} offset = length(dst) resize!(dst, offset + 4) - new{D, C}(dst, offset, conversions) + new{D, C}(dst, offset, conversions, skipnull) end end @@ -133,7 +135,7 @@ function write_field_(writer::BSONWriter, value::BSONCodeWithScope, name::Union{ GC.@preserve dst begin p = pointer(dst) + offset wire_store_(p + 4, value.code) - mappings_writer = BSONWriter(dst, writer.conversions) + mappings_writer = BSONWriter(dst; writer.conversions, writer.skipnull) mappings_writer[] = value.mappings close(mappings_writer) p = pointer(dst) + offset @@ -145,7 +147,7 @@ end function write_field_(writer::BSONWriter, generator::Function, name::Union{String, Symbol}) dst = writer.dst write_header_(dst, BSON_TYPE_DOCUMENT, name, 0) - element_writer = BSONWriter(dst, writer.conversions) + element_writer = BSONWriter(dst; writer.conversions, writer.skipnull) generator(element_writer) close(element_writer) end @@ -155,7 +157,7 @@ const SMALL_INDEX_STRINGS = [string(i) for i in 0:99] function write_field_(writer::BSONWriter, values::Union{AbstractVector, Base.Generator}, name::Union{String, Symbol}) dst = writer.dst write_header_(dst, BSON_TYPE_ARRAY, name, 0) - element_writer = BSONWriter(dst, writer.conversions) + element_writer = BSONWriter(dst; writer.conversions, writer.skipnull) element_writer[] = values close(element_writer) end @@ -177,6 +179,7 @@ end end @inline function Base.setindex!(writer::BSONWriter, value::T, name::Union{String, Symbol}) where T + value === nothing && writer.skipnull && return nothing RT = bson_representation_type(writer.conversions, T) if RT != T write_field_(writer, bson_representation_convert(writer.conversions, RT, value), name)