Skip to content

Commit 7bf0a7b

Browse files
authored
RUST-1998 Update driver to match lossy utf8 api changes (#1395)
1 parent 233200f commit 7bf0a7b

File tree

5 files changed

+31
-21
lines changed

5 files changed

+31
-21
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmap/conn/command.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,6 @@ impl RawCommandResponse {
209209
})
210210
}
211211

212-
/// Used to handle decoding responses where the server may return invalid UTF-8 in error
213-
/// messages.
214-
pub(crate) fn body_utf8_lossy<'a, T: Deserialize<'a>>(&'a self) -> Result<T> {
215-
crate::bson::from_slice_utf8_lossy(self.raw.as_bytes()).map_err(|e| {
216-
Error::from(ErrorKind::InvalidResponse {
217-
message: format!("{}", e),
218-
})
219-
})
220-
}
221-
222212
pub(crate) fn raw_body(&self) -> &RawDocument {
223213
&self.raw
224214
}

src/operation.rs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -433,21 +433,41 @@ impl WriteConcernOnlyBody {
433433
}
434434
}
435435

436-
#[derive(Deserialize, Debug)]
436+
#[derive(Debug)]
437437
pub(crate) struct WriteResponseBody<T = SingleWriteBody> {
438-
#[serde(flatten)]
439438
body: T,
440-
441-
#[serde(rename = "writeErrors")]
442439
write_errors: Option<Vec<IndexedWriteError>>,
443-
444-
#[serde(rename = "writeConcernError")]
445440
write_concern_error: Option<WriteConcernError>,
446-
447-
#[serde(rename = "errorLabels")]
448441
labels: Option<Vec<String>>,
449442
}
450443

444+
impl<'de, T: Deserialize<'de>> Deserialize<'de> for WriteResponseBody<T> {
445+
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
446+
where
447+
D: serde::Deserializer<'de>,
448+
{
449+
use bson::serde_helpers::Utf8LossyDeserialization;
450+
#[derive(Deserialize)]
451+
struct Helper<T> {
452+
#[serde(flatten)]
453+
body: T,
454+
#[serde(rename = "writeErrors")]
455+
write_errors: Option<Utf8LossyDeserialization<Vec<IndexedWriteError>>>,
456+
#[serde(rename = "writeConcernError")]
457+
write_concern_error: Option<Utf8LossyDeserialization<WriteConcernError>>,
458+
#[serde(rename = "errorLabels")]
459+
labels: Option<Vec<String>>,
460+
}
461+
let helper = Helper::deserialize(deserializer)?;
462+
Ok(Self {
463+
body: helper.body,
464+
write_errors: helper.write_errors.map(|l| l.0),
465+
write_concern_error: helper.write_concern_error.map(|l| l.0),
466+
labels: helper.labels,
467+
})
468+
}
469+
}
470+
451471
impl<T> WriteResponseBody<T> {
452472
fn validate(&self) -> Result<()> {
453473
if self.write_errors.is_none() && self.write_concern_error.is_none() {

src/operation/insert.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl OperationWithDefaults for Insert<'_> {
133133
response: RawCommandResponse,
134134
_context: ExecutionContext<'b>,
135135
) -> Result<Self::O> {
136-
let response: WriteResponseBody = response.body_utf8_lossy()?;
136+
let response: WriteResponseBody = response.body()?;
137137
let response_n = Checked::<usize>::try_from(response.n)?;
138138

139139
let mut map = HashMap::new();

src/operation/update.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl OperationWithDefaults for Update {
173173
response: RawCommandResponse,
174174
_context: ExecutionContext<'a>,
175175
) -> Result<Self::O> {
176-
let response: WriteResponseBody<UpdateBody> = response.body_utf8_lossy()?;
176+
let response: WriteResponseBody<UpdateBody> = response.body()?;
177177
response.validate().map_err(convert_insert_many_error)?;
178178

179179
let modified_count = response.n_modified;

0 commit comments

Comments
 (0)