use crate::json::ser::KeyBehavior;
use crate::ser::Behavior;
use serde::ser;
use serde_smile::Error;
use std::io::Write;
pub fn to_vec<T>(value: &T) -> Result<Vec<u8>, Error>
where
T: ?Sized + ser::Serialize,
{
let mut buf = Vec::with_capacity(128);
let mut ser = Serializer::new(&mut buf);
value.serialize(&mut ser)?;
Ok(buf)
}
pub fn to_writer<W, T>(writer: W, value: &T) -> Result<(), Error>
where
W: Write,
T: ?Sized + ser::Serialize,
{
let mut ser = Serializer::new(writer);
value.serialize(&mut ser)?;
Ok(())
}
pub struct Serializer<W>(serde_smile::Serializer<W>);
impl<W> Serializer<W>
where
W: Write,
{
pub fn new(writer: W) -> Serializer<W> {
Serializer(
serde_smile::Serializer::builder()
.raw_binary(true)
.build(writer),
)
}
pub fn get_ref(&self) -> &W {
self.0.get_ref()
}
pub fn get_mut(&mut self) -> &mut W {
self.0.get_mut()
}
pub fn into_inner(self) -> W {
self.0.into_inner()
}
}
impl<'a, W> ser::Serializer for &'a mut Serializer<W>
where
W: Write,
{
impl_serialize_body!(&'a mut serde_smile::Serializer<W>, ValueBehavior);
fn is_human_readable(&self) -> bool {
false
}
}
pub enum ValueBehavior {}
impl Behavior for ValueBehavior {
type KeyBehavior = KeyBehavior;
}