macro_rules! impl_serialize_value_via_value { ($t:ident$(<$($targ:tt $(: $tbound:tt)?),*>)?) => { ... }; }
👎Deprecated since 0.15.1: Legacy serialization API is not type-safe and is going to be removed soon
Expand description
Implements the SerializeValue
trait for a type, provided that the type
already implements the legacy Value
trait.
§Note
The translation from one trait to another encounters a performance penalty
and does not utilize the stronger guarantees of SerializeValue
. Before
resorting to this macro, you should consider other options instead:
- If the impl was generated using the
Value
procedural macro, you should switch to theSerializeValue
procedural macro. The new macro behaves differently by default, so please read its documentation first! - If the impl was written by hand, it is still preferable to rewrite it manually. You have an opportunity to make your serialization logic type-safe and potentially improve performance.
Basically, you should consider using the macro if you have a hand-written impl and the moment it is not easy/not desirable to rewrite it.
§Example
struct NoGenerics {}
impl Value for NoGenerics {
fn serialize<'b>(&self, _buf: &mut Vec<u8>) -> Result<(), ValueTooBig> {
Ok(())
}
}
impl_serialize_value_via_value!(NoGenerics);
// Generic types are also supported. You must specify the bounds if the
// struct/enum contains any.
struct WithGenerics<T, U: Clone>(T, U);
impl<T: Value, U: Clone + Value> Value for WithGenerics<T, U> {
fn serialize<'b>(&self, buf: &mut Vec<u8>) -> Result<(), ValueTooBig> {
self.0.serialize(buf)?;
self.1.clone().serialize(buf)?;
Ok(())
}
}
impl_serialize_value_via_value!(WithGenerics<T, U: Clone>);