mod compat;
mod de;
mod ser;
pub use compat::{BorrowCompat, Compat};
use crate::{config::Config, error::Error};
#[cfg(feature = "alloc")]
pub fn encode_to_vec<T, C>(value: &T, config: C) -> Result<alloc::vec::Vec<u8>, Error>
where
T: serde::Serialize,
C: Config,
{
let writer = crate::enc::VecWriter::new();
let mut encoder = crate::enc::EncoderImpl::new(writer, config);
let serializer = ser::Serializer::new(&mut encoder);
value
.serialize(serializer)
.map_err(|e| Error::OwnedCustom { message: e.msg })?;
Ok(encoder.into_writer().into_vec())
}
pub fn encode_into_slice<T, C>(value: &T, dst: &mut [u8], config: C) -> Result<usize, Error>
where
T: serde::Serialize,
C: Config,
{
let writer = crate::enc::SliceWriter::new(dst);
let mut encoder = crate::enc::EncoderImpl::new(writer, config);
let serializer = ser::Serializer::new(&mut encoder);
value
.serialize(serializer)
.map_err(|e| Error::OwnedCustom { message: e.msg })?;
Ok(encoder.into_writer().bytes_written())
}
pub fn decode_from_slice<'a, T, C>(src: &'a [u8], config: C) -> Result<(T, usize), Error>
where
T: serde::Deserialize<'a>,
C: Config,
{
let reader = crate::de::SliceReader::new(src);
let mut decoder = crate::de::DecoderImpl::new(reader, config);
let deserializer = de::Deserializer::new(&mut decoder);
let value = T::deserialize(deserializer).map_err(|e| Error::OwnedCustom { message: e.msg })?;
let bytes_read = src.len() - decoder.reader().slice.len();
Ok((value, bytes_read))
}
pub fn decode_owned_from_slice<T, C>(src: &[u8], config: C) -> Result<(T, usize), Error>
where
T: serde::de::DeserializeOwned,
C: Config,
{
let reader = crate::de::SliceReader::new(src);
let mut decoder = crate::de::DecoderImpl::new(reader, config);
let deserializer = de::Deserializer::new(&mut decoder);
let value = T::deserialize(deserializer).map_err(|e| Error::OwnedCustom { message: e.msg })?;
let bytes_read = src.len() - decoder.reader().slice.len();
Ok((value, bytes_read))
}
#[cfg(feature = "std")]
pub fn encode_into_std_write<T, W, C>(value: &T, writer: W, config: C) -> Result<usize, Error>
where
T: serde::Serialize,
W: std::io::Write,
C: Config,
{
let io_writer = crate::enc::IoWriter::new(writer);
let mut encoder = crate::enc::EncoderImpl::new(io_writer, config);
let serializer = ser::Serializer::new(&mut encoder);
value
.serialize(serializer)
.map_err(|e| Error::OwnedCustom { message: e.msg })?;
Ok(encoder.into_writer().bytes_written())
}
#[cfg(feature = "std")]
struct CountingReader<R: std::io::Read> {
inner: R,
bytes_read: usize,
}
#[cfg(feature = "std")]
impl<R: std::io::Read> CountingReader<R> {
fn new(inner: R) -> Self {
Self {
inner,
bytes_read: 0,
}
}
fn bytes_read(&self) -> usize {
self.bytes_read
}
}
#[cfg(feature = "std")]
impl<R: std::io::Read> std::io::Read for CountingReader<R> {
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
let n = self.inner.read(buf)?;
self.bytes_read += n;
Ok(n)
}
}
#[cfg(feature = "std")]
pub fn decode_from_std_read<T, R, C>(reader: R, config: C) -> Result<(T, usize), Error>
where
T: serde::de::DeserializeOwned,
R: std::io::Read,
C: Config,
{
let counting = CountingReader::new(reader);
let io_reader = crate::de::IoReader::new(counting);
let mut decoder = crate::de::DecoderImpl::new(io_reader, config);
let deserializer = de::Deserializer::new(&mut decoder);
let value = T::deserialize(deserializer).map_err(|e| Error::OwnedCustom { message: e.msg })?;
let bytes_read = decoder.reader().inner().bytes_read();
Ok((value, bytes_read))
}
#[cfg(feature = "alloc")]
pub fn encode_serde<T>(value: &T) -> Result<alloc::vec::Vec<u8>, Error>
where
T: serde::Serialize,
{
encode_to_vec(value, crate::config::standard())
}
#[cfg(feature = "alloc")]
pub fn decode_serde<T>(bytes: &[u8]) -> Result<T, Error>
where
T: serde::de::DeserializeOwned,
{
decode_owned_from_slice(bytes, crate::config::standard()).map(|(v, _)| v)
}
#[cfg(feature = "alloc")]
pub fn encode_serde_with_config<T, C>(value: &T, config: C) -> Result<alloc::vec::Vec<u8>, Error>
where
T: serde::Serialize,
C: Config,
{
encode_to_vec(value, config)
}
#[cfg(feature = "alloc")]
pub fn decode_serde_with_config<T, C>(bytes: &[u8], config: C) -> Result<T, Error>
where
T: serde::de::DeserializeOwned,
C: Config,
{
decode_owned_from_slice(bytes, config).map(|(v, _)| v)
}
#[cfg(feature = "std")]
pub fn encode_serde_to_file<T>(value: &T, path: impl AsRef<std::path::Path>) -> Result<(), Error>
where
T: serde::Serialize,
{
let file = std::fs::File::create(path)?;
encode_into_std_write(value, file, crate::config::standard())?;
Ok(())
}
#[cfg(feature = "std")]
pub fn decode_serde_from_file<T>(path: impl AsRef<std::path::Path>) -> Result<T, Error>
where
T: serde::de::DeserializeOwned,
{
let file = std::fs::File::open(path)?;
decode_from_std_read(file, crate::config::standard()).map(|(v, _)| v)
}
pub fn encoded_serde_size<T>(value: &T) -> Result<usize, Error>
where
T: serde::Serialize,
{
let writer = crate::enc::SizeWriter::new();
let mut encoder = crate::enc::EncoderImpl::new(writer, crate::config::standard());
let serializer = ser::Serializer::new(&mut encoder);
value
.serialize(serializer)
.map_err(|e| Error::OwnedCustom { message: e.msg })?;
Ok(encoder.into_writer().bytes_written())
}