use std::io::Read;
use serde::de::Deserialize;
use crate::model::ModelFactory;
use crate::{Decoder, Error, Reader, Result};
pub fn from_vec<'de, T>(decoder: &mut Decoder, bytes: Vec<u8>) -> Result<T>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
decoder.decode_vec(bytes, &mut msg)?;
deserialize(msg)
}
pub fn from_buffer<'de, T>(decoder: &mut Decoder, buffer: &[u8]) -> Result<(T, u64)>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
let n = decoder.decode_buffer(buffer, &mut msg)?;
deserialize(msg).map(|r| (r, n))
}
pub fn from_slice<'de, T>(decoder: &mut Decoder, bytes: &[u8]) -> Result<T>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
decoder.decode_slice(bytes, &mut msg)?;
deserialize(msg)
}
#[allow(unused)]
pub fn from_bytes<'de, T>(decoder: &mut Decoder, bytes: &mut bytes::Bytes) -> Result<T>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
decoder.decode_bytes(bytes, &mut msg)?;
deserialize(msg)
}
#[allow(unused)]
pub fn from_reader<'de, T>(decoder: &mut Decoder, rdr: &mut impl Reader) -> Result<T>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
decoder.decode_reader(rdr, &mut msg)?;
deserialize(msg)
}
#[allow(unused)]
pub fn from_stream<'de, T>(decoder: &mut Decoder, rdr: &mut dyn Read) -> Result<T>
where
T: Deserialize<'de>,
{
let mut msg = ModelFactory::new();
decoder.decode_stream(rdr, &mut msg)?;
deserialize(msg)
}
fn deserialize<'de, T>(msg: ModelFactory) -> Result<T>
where
T: Deserialize<'de>,
{
let data = msg
.data
.ok_or_else(|| Error::Runtime("No data in message".to_string()))?;
T::deserialize(data)
}
impl serde::de::Error for Error {
fn custom<T: std::fmt::Display>(msg: T) -> Self {
Self::Runtime(msg.to_string())
}
}