1 #[cfg(test)] 2 mod message_test; 3 4 pub mod message_channel_ack; 5 pub mod message_channel_open; 6 pub mod message_type; 7 8 use message_channel_ack::*; 9 use message_channel_open::*; 10 use message_type::*; 11 12 use crate::error::Error; 13 14 use util::marshal::*; 15 16 use bytes::{Buf, BufMut}; 17 18 /// A parsed DataChannel message 19 #[derive(Eq, PartialEq, Clone, Debug)] 20 pub enum Message { 21 DataChannelAck(DataChannelAck), 22 DataChannelOpen(DataChannelOpen), 23 } 24 25 impl MarshalSize for Message { marshal_size(&self) -> usize26 fn marshal_size(&self) -> usize { 27 match self { 28 Message::DataChannelAck(m) => m.marshal_size() + MESSAGE_TYPE_LEN, 29 Message::DataChannelOpen(m) => m.marshal_size() + MESSAGE_TYPE_LEN, 30 } 31 } 32 } 33 34 impl Marshal for Message { marshal_to(&self, mut buf: &mut [u8]) -> Result<usize, util::Error>35 fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize, util::Error> { 36 let mut bytes_written = 0; 37 let n = self.message_type().marshal_to(buf)?; 38 buf = &mut buf[n..]; 39 bytes_written += n; 40 bytes_written += match self { 41 Message::DataChannelAck(_) => 0, 42 Message::DataChannelOpen(open) => open.marshal_to(buf)?, 43 }; 44 Ok(bytes_written) 45 } 46 } 47 48 impl Unmarshal for Message { unmarshal<B>(buf: &mut B) -> Result<Self, util::Error> where Self: Sized, B: Buf,49 fn unmarshal<B>(buf: &mut B) -> Result<Self, util::Error> 50 where 51 Self: Sized, 52 B: Buf, 53 { 54 if buf.remaining() < MESSAGE_TYPE_LEN { 55 return Err(Error::UnexpectedEndOfBuffer { 56 expected: MESSAGE_TYPE_LEN, 57 actual: buf.remaining(), 58 } 59 .into()); 60 } 61 62 match MessageType::unmarshal(buf)? { 63 MessageType::DataChannelAck => Ok(Self::DataChannelAck(DataChannelAck {})), 64 MessageType::DataChannelOpen => { 65 Ok(Self::DataChannelOpen(DataChannelOpen::unmarshal(buf)?)) 66 } 67 } 68 } 69 } 70 71 impl Message { message_type(&self) -> MessageType72 pub fn message_type(&self) -> MessageType { 73 match self { 74 Self::DataChannelAck(_) => MessageType::DataChannelAck, 75 Self::DataChannelOpen(_) => MessageType::DataChannelOpen, 76 } 77 } 78 } 79