Skip to content

Commit f525546

Browse files
authored
RUST-426 Fix Decimal128 human-readable serialization (#479)
1 parent 4114d03 commit f525546

File tree

4 files changed

+26
-29
lines changed

4 files changed

+26
-29
lines changed

src/de/raw.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use crate::{
1717
serde_helpers::HUMAN_READABLE_NEWTYPE,
1818
spec::{BinarySubtype, ElementType},
1919
uuid::UUID_NEWTYPE_NAME,
20-
Bson,
2120
DateTime,
2221
Decimal128,
2322
DeserializerOptions,
@@ -292,9 +291,8 @@ impl<'de> Deserializer<'de> {
292291
)),
293292
_ => {
294293
let code = read_string(&mut self.bytes, utf8_lossy)?;
295-
let doc = Bson::JavaScriptCode(code).into_extended_document(false);
296294
visitor.visit_map(MapDeserializer::new(
297-
doc,
295+
doc! { "$code": code },
298296
#[allow(deprecated)]
299297
DeserializerOptions::builder().human_readable(false).build(),
300298
))
@@ -350,9 +348,8 @@ impl<'de> Deserializer<'de> {
350348
)),
351349
_ => {
352350
let symbol = read_string(&mut self.bytes, utf8_lossy)?;
353-
let doc = Bson::Symbol(symbol).into_extended_document(false);
354351
visitor.visit_map(MapDeserializer::new(
355-
doc,
352+
doc! { "$symbol": symbol },
356353
#[allow(deprecated)]
357354
DeserializerOptions::builder().human_readable(false).build(),
358355
))

src/decimal128.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl Decimal128 {
4848

4949
impl fmt::Debug for Decimal128 {
5050
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
51-
write!(f, "Decimal128(...)")
51+
write!(f, "Decimal128({})", hex::encode(self.bytes))
5252
}
5353
}
5454

src/ser/serde.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use serde::ser::{
1010
SerializeTupleStruct,
1111
SerializeTupleVariant,
1212
};
13-
use serde_bytes::Bytes;
1413

1514
use crate::{
1615
bson::{Array, Bson, DbPointer, Document, JavaScriptCodeWithScope, Regex, Timestamp},
@@ -85,11 +84,7 @@ impl Serialize for Bson {
8584
}
8685
Bson::RegularExpression(re) => re.serialize(serializer),
8786
Bson::Timestamp(t) => t.serialize(serializer),
88-
Bson::Decimal128(d) => {
89-
let mut state = serializer.serialize_struct("$numberDecimal", 1)?;
90-
state.serialize_field("$numberDecimalBytes", Bytes::new(&d.bytes))?;
91-
state.end()
92-
}
87+
Bson::Decimal128(d) => d.serialize(serializer),
9388
Bson::Undefined => {
9489
let mut state = serializer.serialize_struct("$undefined", 1)?;
9590
state.serialize_field("$undefined", &true)?;
@@ -705,15 +700,14 @@ impl Serialize for Decimal128 {
705700
where
706701
S: ser::Serializer,
707702
{
708-
if serializer.is_human_readable() {
709-
let mut state = serializer.serialize_map(Some(1))?;
710-
state.serialize_entry("$numberDecimal", &self.to_string())?;
711-
state.end()
703+
let human_readable = serializer.is_human_readable();
704+
let mut state = serializer.serialize_struct("$numberDecimal", 1)?;
705+
if human_readable {
706+
state.serialize_field("$numberDecimal", &self.to_string())?;
712707
} else {
713-
let mut state = serializer.serialize_struct("$numberDecimal", 1)?;
714708
state.serialize_field("$numberDecimalBytes", serde_bytes::Bytes::new(&self.bytes))?;
715-
state.end()
716709
}
710+
state.end()
717711
}
718712
}
719713

src/tests/spec/corpus.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -267,12 +267,15 @@ fn run_test(test: TestFile) {
267267
description,
268268
);
269269

270-
assert_eq!(
271-
hex::encode(documenttowriter_todocument_documentfromreader_cb).to_lowercase(),
272-
valid.canonical_bson.to_lowercase(),
273-
"{}",
274-
description,
275-
);
270+
// bson::to_document(&Document) may be lossy due to round-tripping extjson
271+
if valid.lossy != Some(true) {
272+
assert_eq!(
273+
hex::encode(documenttowriter_todocument_documentfromreader_cb).to_lowercase(),
274+
valid.canonical_bson.to_lowercase(),
275+
"{}",
276+
description,
277+
);
278+
}
276279

277280
assert_eq!(
278281
hex::encode(tovec_documentfromreader_cb).to_lowercase(),
@@ -313,11 +316,14 @@ fn run_test(test: TestFile) {
313316
description
314317
);
315318

316-
assert_eq!(
317-
documentfromreader_cb, todocument_documentfromreader_cb,
318-
"{}",
319-
description
320-
);
319+
// bson::to_document(&Document) may be lossy due to round-tripping extjson
320+
if valid.lossy != Some(true) {
321+
assert_eq!(
322+
documentfromreader_cb, todocument_documentfromreader_cb,
323+
"{}",
324+
description
325+
);
326+
}
321327

322328
assert_eq!(
323329
document_from_raw_document, documentfromreader_cb,

0 commit comments

Comments
 (0)