xref: /webrtc/data/src/message/mod.rs (revision ffe74184)
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