Skip to content

Commit d3a752d

Browse files
authored
RUST-2184 Accept any BSON number for CreateCollectionOptions::size (#1460)
1 parent 7660796 commit d3a752d

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

src/db/options.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ pub struct CreateCollectionOptions {
4444

4545
/// The maximum size (in bytes) for a capped collection. This option is ignored if `capped` is
4646
/// not set to true.
47-
#[serde(serialize_with = "serde_util::serialize_u64_option_as_i64")]
47+
#[serde(
48+
serialize_with = "serde_util::serialize_u64_option_as_i64",
49+
deserialize_with = "serde_util::deserialize_option_u64_from_bson_number",
50+
default
51+
)]
4852
pub size: Option<u64>,
4953

5054
/// The maximum number of documents in a capped collection. The `size` limit takes precedence

src/serde_util.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,21 @@ where
118118
.ok_or_else(|| serde::de::Error::custom(format!("could not deserialize u64 from {bson:?}")))
119119
}
120120

121+
pub(crate) fn deserialize_option_u64_from_bson_number<'de, D>(
122+
deserializer: D,
123+
) -> std::result::Result<Option<u64>, D::Error>
124+
where
125+
D: Deserializer<'de>,
126+
{
127+
Option::<Bson>::deserialize(deserializer)?
128+
.map(|bson| {
129+
get_u64(&bson).ok_or_else(|| {
130+
serde::de::Error::custom(format!("could not deserialize u64 from {bson:?}"))
131+
})
132+
})
133+
.transpose()
134+
}
135+
121136
pub(crate) fn serialize_error_as_string<S: Serializer>(
122137
val: &Error,
123138
serializer: S,

src/test/db.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,18 @@ async fn test_run_command() {
468468
assert_eq!(v[0].as_ref().unwrap().get_str("foo").unwrap(), "bar");
469469
}
470470
}
471+
472+
#[test]
473+
fn create_collection_options_deserialize() {
474+
let source = doc! {
475+
"capped": true,
476+
"size": 5253511168.0,
477+
"autoIndexId": false,
478+
};
479+
let _: CreateCollectionOptions = crate::bson_compat::deserialize_from_document(source).unwrap();
480+
let source = doc! {
481+
"capped": true,
482+
"autoIndexId": false,
483+
};
484+
let _: CreateCollectionOptions = crate::bson_compat::deserialize_from_document(source).unwrap();
485+
}

0 commit comments

Comments
 (0)