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