mod error;
mod raw;
mod serde;
pub use self::{
error::{Error, Result},
serde::{Deserializer, DeserializerOptions},
};
use std::io::Read;
use crate::{
bson::{Bson, Document, Timestamp},
ser::write_i32,
spec::BinarySubtype,
};
use ::serde::{
de::{DeserializeOwned, Error as _},
Deserialize,
};
pub(crate) use self::serde::{convert_unsigned_to_signed_raw, BsonVisitor};
pub(crate) use self::raw::Deserializer as RawDeserializer;
pub(crate) const MAX_BSON_SIZE: i32 = 16 * 1024 * 1024;
pub(crate) const MIN_BSON_DOCUMENT_SIZE: i32 = 4 + 1; pub(crate) const MIN_BSON_STRING_SIZE: i32 = 4 + 1; pub(crate) const MIN_CODE_WITH_SCOPE_SIZE: i32 = 4 + MIN_BSON_STRING_SIZE + MIN_BSON_DOCUMENT_SIZE;
#[derive(Debug, Clone, Copy)]
enum DeserializerHint {
None,
BinarySubtype(BinarySubtype),
RawBson,
}
impl Timestamp {
pub(crate) fn from_reader<R: Read>(mut reader: R) -> Result<Self> {
let mut bytes = [0; 8];
reader.read_exact(&mut bytes)?;
Ok(Timestamp::from_le_bytes(bytes))
}
}
pub fn from_bson<T>(bson: Bson) -> Result<T>
where
T: DeserializeOwned,
{
let de = Deserializer::new(bson);
#[cfg(feature = "serde_path_to_error")]
{
return serde_path_to_error::deserialize(de).map_err(Error::with_path);
}
#[cfg(not(feature = "serde_path_to_error"))]
{
Deserialize::deserialize(de)
}
}
pub fn from_bson_with_options<T>(bson: Bson, options: DeserializerOptions) -> Result<T>
where
T: DeserializeOwned,
{
let de = Deserializer::new_with_options(bson, options);
Deserialize::deserialize(de)
}
pub fn from_document<T>(doc: Document) -> Result<T>
where
T: DeserializeOwned,
{
from_bson(Bson::Document(doc))
}
pub fn from_document_with_options<T>(doc: Document, options: DeserializerOptions) -> Result<T>
where
T: DeserializeOwned,
{
let de = Deserializer::new_with_options(Bson::Document(doc), options);
Deserialize::deserialize(de)
}
pub(crate) fn reader_to_vec<R: Read>(mut reader: R) -> Result<Vec<u8>> {
let mut buf = [0; 4];
reader.read_exact(&mut buf)?;
let length = i32::from_le_bytes(buf);
if length < MIN_BSON_DOCUMENT_SIZE {
return Err(Error::custom("document size too small"));
}
let mut bytes = Vec::with_capacity(length as usize);
write_i32(&mut bytes, length).map_err(Error::custom)?;
reader.take(length as u64 - 4).read_to_end(&mut bytes)?;
Ok(bytes)
}
pub fn from_reader<R, T>(reader: R) -> Result<T>
where
T: DeserializeOwned,
R: Read,
{
let bytes = reader_to_vec(reader)?;
from_slice(bytes.as_slice())
}
pub fn from_reader_utf8_lossy<R, T>(reader: R) -> Result<T>
where
T: DeserializeOwned,
R: Read,
{
let bytes = reader_to_vec(reader)?;
from_slice_utf8_lossy(bytes.as_slice())
}
pub fn from_slice<'de, T>(bytes: &'de [u8]) -> Result<T>
where
T: Deserialize<'de>,
{
from_raw(raw::Deserializer::new(bytes, false)?)
}
pub fn from_slice_utf8_lossy<'de, T>(bytes: &'de [u8]) -> Result<T>
where
T: Deserialize<'de>,
{
from_raw(raw::Deserializer::new(bytes, true)?)
}
pub(crate) fn from_raw<'de, T: Deserialize<'de>>(
deserializer: raw::Deserializer<'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)
}
}