Skip to content

Commit 062e159

Browse files
committed
shift recursion to doc conversion
1 parent 10eb4f3 commit 062e159

File tree

2 files changed

+45
-42
lines changed

2 files changed

+45
-42
lines changed

src/raw/document.rs

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ use crate::{
99
de::MIN_BSON_DOCUMENT_SIZE,
1010
error::{Error, Result},
1111
raw::{error::ErrorKind, serde::OwnedOrBorrowedRawDocument, RAW_DOCUMENT_NEWTYPE},
12+
Bson,
1213
DateTime,
14+
JavaScriptCodeWithScope,
15+
RawBson,
16+
RawJavaScriptCodeWithScope,
1317
Timestamp,
1418
};
1519

@@ -532,11 +536,45 @@ impl RawDocument {
532536
/// Copy this into a [`Document`], returning an error if invalid BSON is encountered. Any
533537
/// invalid UTF-8 sequences will be replaced with the Unicode replacement character.
534538
pub fn to_document_utf8_lossy(&self) -> Result<Document> {
535-
self.iter_elements()
536-
.map(|res| {
537-
res.and_then(|e| Ok((e.key().to_owned(), e.value_utf8_lossy()?.try_into()?)))
538-
})
539-
.collect()
539+
let mut out = Document::new();
540+
for elem in self.iter_elements() {
541+
let elem = elem?;
542+
let value = deep_utf8_lossy(elem.value_utf8_lossy()?)?;
543+
out.insert(elem.key(), value);
544+
}
545+
Ok(out)
546+
}
547+
}
548+
549+
fn deep_utf8_lossy(src: RawBson) -> Result<Bson> {
550+
match src {
551+
RawBson::Array(arr) => {
552+
let mut tmp = vec![];
553+
for elem in arr.iter_elements() {
554+
tmp.push(deep_utf8_lossy(elem?.value_utf8_lossy()?)?);
555+
}
556+
Ok(Bson::Array(tmp))
557+
}
558+
RawBson::Document(doc) => {
559+
let mut tmp = doc! {};
560+
for elem in doc.iter_elements() {
561+
let elem = elem?;
562+
tmp.insert(elem.key(), deep_utf8_lossy(elem.value_utf8_lossy()?)?);
563+
}
564+
Ok(Bson::Document(tmp))
565+
}
566+
RawBson::JavaScriptCodeWithScope(RawJavaScriptCodeWithScope { code, scope }) => {
567+
let mut tmp = doc! {};
568+
for elem in scope.iter_elements() {
569+
let elem = elem?;
570+
tmp.insert(elem.key(), deep_utf8_lossy(elem.value_utf8_lossy()?)?);
571+
}
572+
Ok(Bson::JavaScriptCodeWithScope(JavaScriptCodeWithScope {
573+
code,
574+
scope: tmp,
575+
}))
576+
}
577+
v => v.try_into(),
540578
}
541579
}
542580

src/raw/iter.rs

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ use crate::{
99
DateTime,
1010
Decimal128,
1111
RawArray,
12-
RawArrayBuf,
1312
RawBinaryRef,
1413
RawBson,
1514
RawDbPointerRef,
16-
RawDocumentBuf,
1715
RawJavaScriptCodeWithScopeRef,
1816
RawRegexRef,
1917
Timestamp,
@@ -270,41 +268,8 @@ impl<'a> RawElement<'a> {
270268

271269
pub fn value_utf8_lossy(&self) -> Result<RawBson> {
272270
match self.value_utf8_lossy_inner()? {
273-
Some(v) => Ok(match v {
274-
Utf8LossyBson::JavaScriptCodeWithScope(Utf8LossyJavaScriptCodeWithScope {
275-
code,
276-
scope,
277-
}) => {
278-
let mut tmp = RawDocumentBuf::new();
279-
for elem in scope.iter_elements() {
280-
let elem = elem?;
281-
tmp.append(elem.key(), elem.value_utf8_lossy()?);
282-
}
283-
RawBson::JavaScriptCodeWithScope(super::RawJavaScriptCodeWithScope {
284-
code,
285-
scope: tmp,
286-
})
287-
}
288-
v => v.into(),
289-
}),
290-
None => Ok(match self.value()? {
291-
RawBsonRef::Array(arr) => {
292-
let mut tmp = RawArrayBuf::new();
293-
for elem in arr.iter_elements() {
294-
tmp.push(elem?.value_utf8_lossy()?);
295-
}
296-
RawBson::Array(tmp)
297-
}
298-
RawBsonRef::Document(doc) => {
299-
let mut tmp = RawDocumentBuf::new();
300-
for elem in doc.iter_elements() {
301-
let elem = elem?;
302-
tmp.append(elem.key(), elem.value_utf8_lossy()?);
303-
}
304-
RawBson::Document(tmp)
305-
}
306-
v => v.to_raw_bson(),
307-
}),
271+
Some(v) => Ok(v.into()),
272+
None => Ok(self.value()?.to_raw_bson()),
308273
}
309274
}
310275

0 commit comments

Comments
 (0)