pub(crate) mod raw;
mod serde;
pub use self::serde::Deserializer;
use std::io::Read;
use crate::{
bson::{Bson, Document},
error::{Error, Result},
raw::reader_to_vec,
spec::BinarySubtype,
};
#[rustfmt::skip]
use ::serde::{de::DeserializeOwned, Deserialize};
pub(crate) use self::serde::{convert_unsigned_to_signed_raw, BsonVisitor};
#[derive(Debug, Clone, Copy)]
enum DeserializerHint {
None,
BinarySubtype(BinarySubtype),
RawBson,
}
pub fn deserialize_from_bson<T>(bson: Bson) -> Result<T>
where
T: DeserializeOwned,
{
let de = Deserializer::new(bson);
#[cfg(feature = "serde_path_to_error")]
{
serde_path_to_error::deserialize(de).map_err(Error::with_path)
}
#[cfg(not(feature = "serde_path_to_error"))]
{
Deserialize::deserialize(de)
}
}
pub fn deserialize_from_document<T>(doc: Document) -> Result<T>
where
T: DeserializeOwned,
{
deserialize_from_bson(Bson::Document(doc))
}
pub fn deserialize_from_reader<R, T>(reader: R) -> Result<T>
where
T: DeserializeOwned,
R: Read,
{
let bytes = reader_to_vec(reader)?;
deserialize_from_slice(bytes.as_slice())
}
pub fn deserialize_from_slice<'de, T>(bytes: &'de [u8]) -> Result<T>
where
T: Deserialize<'de>,
{
deserialize_from_raw(raw::RawDeserializer::new(bytes)?)
}
pub(crate) fn deserialize_from_raw<'de, T: Deserialize<'de>>(
deserializer: raw::RawDeserializer<'de>,
) -> Result<T> {
#[cfg(feature = "serde_path_to_error")]
{
serde_path_to_error::deserialize(deserializer).map_err(Error::with_path)
}
#[cfg(not(feature = "serde_path_to_error"))]
{
T::deserialize(deserializer)
}
}