From efdc8b567aecd43287daffc49c4ebee8517eaae2 Mon Sep 17 00:00:00 2001 From: Christian Rorvik Date: Fri, 30 May 2025 21:49:11 +0200 Subject: [PATCH] Write from reader --- Project.toml | 2 +- src/writer.jl | 7 +++++++ test/writer_tests.jl | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 9bb8ae0..614a729 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "LightBSON" uuid = "a4a7f996-b3a6-4de6-b9db-2fa5f350df41" authors = ["Christian Rorvik "] -version = "1.1.0" +version = "1.2.0" [deps] DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" diff --git a/src/writer.jl b/src/writer.jl index e7ec277..4f7bbac 100644 --- a/src/writer.jl +++ b/src/writer.jl @@ -185,6 +185,13 @@ end end end +@inline function Base.setindex!(writer::BSONWriter, reader::BSONReader, name::Union{String, Symbol}) + len = sizeof(reader) + offset = write_header_(writer.dst, reader.type, name, len) + GC.@preserve reader writer unsafe_copyto!(pointer(writer.dst) + offset, pointer(reader), len) + nothing +end + function Base.setindex!(writer::BSONWriter, fields::AbstractDict{<:Union{String, Symbol}}) for (key, value) in fields writer[key] = value diff --git a/test/writer_tests.jl b/test/writer_tests.jl index 06e9dd2..c64af7f 100644 --- a/test/writer_tests.jl +++ b/test/writer_tests.jl @@ -158,4 +158,21 @@ end @test BSONReader(buf, StrictBSONValidator())["x"][EmptyStruct] == EmptyStruct() end +@testset "from reader" begin + doc1 = bson_write(UInt8[], (; x = 1, y = "foo")) + doc2 = bson_write(UInt8[], (; z = false)) + buf = empty!(fill(0xff, 1000)) + writer = BSONWriter(buf) + writer["a"] = BSONReader(doc1) + writer["b"] = BSONReader(doc2) + writer["c"] = [BSONReader(doc1), BSONReader(doc2)] + close(writer) + @test BSONReader(buf, StrictBSONValidator())["a"][Any] == LittleDict("x" => 1, "y" => "foo") + @test BSONReader(buf, StrictBSONValidator())["b"][Any] == LittleDict("z" => false) + @test BSONReader(buf, StrictBSONValidator())["c"][Any] == [ + LittleDict("x" => 1, "y" => "foo"), + LittleDict("z" => false) + ] +end + end