sheave_core/messages/
stream_begin.rs

1use std::io::Result as IOResult;
2use crate::{
3    ByteBuffer,
4    Decoder,
5    Encoder,
6    messages::{
7        Channel,
8        ChunkData,
9        EventType,
10        UserControl,
11        headers::MessageType,
12    }
13};
14
15/// The event to tell that the stream is ready to a client.
16///
17/// Following format is required.
18///
19/// |Event Data|Length (in bytes)|Description|
20/// | :- | -: | :- |
21/// |Message ID|4|The message ID which is same as contained in [`createStream`].|
22///
23/// [`createStream`]: crate::messages::CreateStream
24#[derive(Debug, Clone, Copy, PartialEq, Eq)]
25pub struct StreamBegin(u32);
26
27impl StreamBegin {
28    /// Constructs a StreamBegin event.
29    pub fn new(message_id: u32) -> Self {
30        Self(message_id)
31    }
32
33    /// Gets the message ID which this event has.
34    pub fn get_message_id(&self) -> u32 {
35        self.0
36    }
37}
38
39impl From<StreamBegin> for u32 {
40    fn from(stream_begin: StreamBegin) -> Self {
41        stream_begin.0
42    }
43}
44
45impl ChunkData for StreamBegin {
46    const CHANNEL: Channel = Channel::Network;
47    const MESSAGE_TYPE: MessageType = MessageType::UserControl;
48}
49
50impl UserControl for StreamBegin {
51    const EVENT_TYPE: EventType = EventType::StreamBegin;
52}
53
54impl Decoder<StreamBegin> for ByteBuffer {
55    /// Decodes bytes into a StreamBegin event.
56    ///
57    /// # Errors
58    ///
59    /// * [`InsufficientBufferLength`]
60    ///
61    /// When some field misses.
62    ///
63    /// # Examples
64    ///
65    /// ```rust
66    /// use sheave_core::{
67    ///     ByteBuffer,
68    ///     Decoder,
69    ///     Encoder,
70    ///     messages::{
71    ///         EventType,
72    ///         StreamBegin
73    ///     }
74    /// };
75    ///
76    /// let mut buffer = ByteBuffer::default();
77    /// buffer.put_u32_be(u32::default());
78    /// assert!(Decoder::<StreamBegin>::decode(&mut buffer).is_ok());
79    ///
80    /// let mut buffer = ByteBuffer::default();
81    /// assert!(Decoder::<StreamBegin>::decode(&mut buffer).is_err())
82    /// ```
83    ///
84    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
85    fn decode(&mut self) -> IOResult<StreamBegin> {
86        self.get_u32_be().map(StreamBegin)
87    }
88}
89
90impl Encoder<StreamBegin> for ByteBuffer {
91    /// Encodes a StreamBegin event into bytes.
92    fn encode(&mut self, stream_begin: &StreamBegin) {
93        self.put_u32_be(stream_begin.get_message_id());
94    }
95}
96
97#[cfg(test)]
98mod tests {
99    use super::*;
100
101    #[test]
102    fn decode_stream_begin() {
103        let mut buffer = ByteBuffer::default();
104        buffer.put_u32_be(u32::default());
105        let result: IOResult<StreamBegin> = buffer.decode();
106        assert!(result.is_ok());
107        let actual = result.unwrap();
108        let expected = StreamBegin::new(u32::default());
109        assert_eq!(expected, actual)
110    }
111
112    #[test]
113    fn encode_stream_begin() {
114        let mut buffer = ByteBuffer::default();
115        let expected_message_id = u32::default();
116        let expected = StreamBegin::new(expected_message_id);
117        buffer.encode(&expected);
118        let actual_message_id = buffer.get_u32_be().unwrap();
119        assert_eq!(expected_message_id, actual_message_id)
120    }
121}