1use std::io::{
4 Cursor,
5 Result,
6};
7
8use crate::descriptor::MessageDescriptor;
9use crate::Message as ConcreteMessage;
10
11pub trait Message {
12 fn erased_descriptor(&self) -> Option<MessageDescriptor>;
13 fn erased_compute_size(&self) -> usize;
14 fn erased_compute_grpc_slices_size(&self) -> usize;
15 fn erased_serialize(&self) -> Vec<u8>;
16 fn erased_deserialize(&mut self, r: &[u8]) -> Result<()>;
17}
18
19impl<T> Message for T
20where
21 T: ConcreteMessage,
22{
23 fn erased_descriptor(&self) -> Option<MessageDescriptor> {
24 self.descriptor()
25 }
26
27 fn erased_compute_size(&self) -> usize {
28 self.compute_size()
29 }
30
31 fn erased_compute_grpc_slices_size(&self) -> usize {
32 self.compute_grpc_slices_size()
33 }
34
35 fn erased_serialize(&self) -> Vec<u8> {
36 self.serialize_to_vec()
37 }
38
39 fn erased_deserialize(&mut self, r: &[u8]) -> Result<()> {
40 self.deserialize(&mut Cursor::new(r))
41 }
42}