use mongodb::options::{ClientOptions, GridFsBucketOptions, ReadConcern, SelectionCriteria, WriteConcern};
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StorageConfig {
#[cfg_attr(
feature = "serde",
serde(
default,
serialize_with = "serialize_selection_criteria",
skip_serializing_if = "Option::is_none"
)
)]
pub selection_criteria: Option<SelectionCriteria>,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
pub write_concern: Option<WriteConcern>,
#[cfg_attr(feature = "serde", serde(default, skip_serializing))]
pub client_options: ClientOptions,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
pub read_concern: Option<ReadConcern>,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
pub chunk_size: Option<u32>,
#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "Option::is_none"))]
pub database: Option<String>,
pub bucket: String,
}
impl From<StorageConfig> for GridFsBucketOptions {
fn from(value: StorageConfig) -> Self {
GridFsBucketOptions::builder()
.selection_criteria(value.selection_criteria)
.read_concern(value.read_concern)
.write_concern(value.write_concern)
.chunk_size_bytes(value.chunk_size)
.bucket_name(value.bucket)
.build()
}
}
#[cfg(feature = "serde")]
#[allow(unused)]
fn serialize_selection_criteria<S: ::serde::ser::Serializer>(
value: &Option<SelectionCriteria>,
serializer: S,
) -> Result<S::Ok, S::Error> {
use ::mongodb::options::ReadPreference;
use ::serde::{ser::Error, Serialize};
if let Some(value) = value {
if matches!(value, SelectionCriteria::Predicate(_)) {
return Err(S::Error::custom(
"cannot use `SelectionCriteria::Predicate` to be serialized",
));
}
match value {
SelectionCriteria::ReadPreference(rp) => return ReadPreference::serialize(rp, serializer),
_ => unimplemented!(),
}
}
serializer.serialize_none()
}