webrtc_data/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 util::marshal::*;
13
14use crate::error::Error;
15
16#[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}