Skip to content

Commit c2083d4

Browse files
committed
recursion
1 parent 36a564f commit c2083d4

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

src/raw/array.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ impl RawArray {
212212
pub fn is_empty(&self) -> bool {
213213
self.doc.is_empty()
214214
}
215+
216+
/// Returns an iterator over the `RawElement`s in the array.
217+
pub fn iter_elements(&self) -> RawIter {
218+
RawIter::new(&self.doc)
219+
}
215220
}
216221

217222
impl std::fmt::Debug for RawArray {

src/raw/iter.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ use crate::{
99
DateTime,
1010
Decimal128,
1111
RawArray,
12+
RawArrayBuf,
1213
RawBinaryRef,
1314
RawBson,
1415
RawDbPointerRef,
16+
RawDocumentBuf,
1517
RawJavaScriptCodeWithScopeRef,
1618
RawRegexRef,
1719
Timestamp,
@@ -267,8 +269,41 @@ impl<'a> RawElement<'a> {
267269

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

src/tests/modules/serializer_deserializer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ fn test_encode_decode_utf8_string_invalid() {
6868
let bytes = b"\x80\xae".to_vec();
6969
let src = unsafe { String::from_utf8_unchecked(bytes) };
7070

71-
let doc = doc! { "key": src };
71+
let doc = doc! { "key": &src, "subdoc": { "subkey": &src } };
7272

7373
let mut buf = Vec::new();
7474
doc.to_writer(&mut buf).unwrap();
7575

76-
let expected = doc! { "key": "��" };
76+
let expected = doc! { "key": "��", "subdoc": { "subkey": "��" } };
7777
let decoded = RawDocumentBuf::from_reader(&mut Cursor::new(buf))
7878
.unwrap()
7979
.to_document_utf8_lossy()

0 commit comments

Comments
 (0)