rtc_datachannel/message/
mod.rs1#[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#[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}