1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#![feature(type_name_of_val)] pub extern crate grpcio; extern crate self as bincode_grpc; pub extern crate tracing; pub mod bi_codec { use grpcio::MessageReader; use grpcio::Result; use serde::de::DeserializeOwned; use serde::Serialize; use std::io::{BufReader, Read}; use std::time::Instant; pub fn ser<M: Serialize>(msg: &M, buf: &mut Vec<u8>) { let span = tracing::span!(tracing::Level::DEBUG, "serialize"); let _guard = span.enter(); let start_time = Instant::now(); let serialized = bincode::serialize(msg).expect("serialize message failed"); assert_eq!(std::mem::replace(buf, serialized).len(), 0); tracing::debug!("serialize {:?} time cost {:?} on thread {:?}", std::any::type_name_of_val(&msg), start_time.elapsed(), std::thread::current().id()); } pub fn de<M: DeserializeOwned>(mut reader: MessageReader) -> Result<M> { let span = tracing::span!(tracing::Level::DEBUG, "deserialize"); let _guard = span.enter(); let start_time = Instant::now(); let mut buf = Vec::with_capacity(reader.len()); reader.read_to_end(&mut buf).expect("Reading message from buffer failed"); let result = bincode::deserialize(&mut buf).expect("Deserializing message from buffer failed"); tracing::debug!("deserialize {:?} time cost {:?} on thread {:?}", std::any::type_name_of_val(&result), start_time.elapsed(), std::thread::current().id()); Ok(result) } } pub use bincode_grpc_macro::{server, service};