How to implement many similar methods for determining?

I am implementing a Serde Serializertrait that has many methods. Many of them look very similar (for example, for integer types they simply copy bytes to some buffer), so it would be nice to generate them. Can I write some general function or macro to implement many of them in one way (macro)?

I have something like this:

use serde::Serializer;
use byteorder::{WriteBytesExt, LittleEndian};

struct MySerializer {
     ...
}

impl Serializer for MySerializer {
    fn serialize_i32(&mut self, v:i32) -> Result<(), Error> {
        try!(self.buffer.write_i32::<LittleEndian>(v));
    }
    fn serialize_u8(&mut self, v:u8) -> Result<(), Error> {
        try!(self.buffer.write_u8::<LittleEndian>(v));
    }
    // many similar looking functions here
}
+4
source share
1 answer

I found an example in the serde / bench project:

macro_rules! impl_nums {
    ($ty:ty, $dser_method:ident, $visitor_method:ident, $reader_method:ident) => {
        #[inline]
        fn $dser_method<V>(&mut self, mut visitor: V) -> Result<V::Value>
            where V: Visitor
        {
            let value = try!(self.reader.$reader_method::<NativeEndian>());
            visitor.$visitor_method(value)
        }
    };
}

impl_nums!(u16, deserialize_u16, visit_u16, read_u16);
impl_nums!(u32, deserialize_u32, visit_u32, read_u32);
....

, - concat_idents! github.

0

Source: https://habr.com/ru/post/1658996/


All Articles