webrtc_data/message/
mod.rs

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