sheave_core/messages/
create_stream.rs

1use std::io::Result as IOResult;
2use crate::{
3    ByteBuffer,
4    Decoder,
5    Encoder,
6    messages::{
7        Channel,
8        ChunkData,
9        Command,
10        amf::v0::Null,
11        headers::MessageType
12    }
13};
14
15/// The command to request emitting a message ID to a server.
16///
17/// Following format is required:
18///
19/// |Field|AMF Type|Value|
20/// | :- | :- | :- |
21/// ||[`Null`]|Nothing but an AMF's type marker is in.|
22///
23/// [`Null`]: crate::messages::amf::v0::Null
24#[derive(Debug, Clone, Copy, Default, PartialEq)]
25pub struct CreateStream;
26
27impl ChunkData for CreateStream {
28    const CHANNEL: Channel = Channel::System;
29    const MESSAGE_TYPE: MessageType = MessageType::Command;
30}
31
32impl Command for CreateStream {}
33
34impl Decoder<CreateStream> for ByteBuffer {
35    /// Decodes bytes into a CreateStream command.
36    ///
37    /// # Errors
38    ///
39    /// * [`InsufficientBufferLength`]
40    ///
41    /// When some field misses.
42    ///
43    /// * [`InconsistentMarker`]
44    ///
45    /// When some value is inconsistent with its marker.
46    ///
47    /// # Examples
48    ///
49    /// ```rust
50    /// use sheave_core::{
51    ///     ByteBuffer,
52    ///     Decoder,
53    ///     Encoder,
54    ///     messages::{
55    ///         CreateStream,
56    ///         amf::v0::Null,
57    ///     }
58    /// };
59    ///
60    /// let mut buffer = ByteBuffer::default();
61    /// buffer.encode(&Null);
62    /// assert!(Decoder::<CreateStream>::decode(&mut buffer).is_ok());
63    ///
64    /// let mut buffer = ByteBuffer::default();
65    /// assert!(Decoder::<CreateStream>::decode(&mut buffer).is_err())
66    /// ```
67    ///
68    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
69    /// [`InconsistentMarker`]: crate::messages::amf::InconsistentMarker
70    fn decode(&mut self) -> IOResult<CreateStream> {
71        Decoder::<Null>::decode(self)?;
72        Ok(CreateStream)
73    }
74}
75
76impl Encoder<CreateStream> for ByteBuffer {
77    /// Encodes a CreateSteam command into bytes.
78    fn encode(&mut self, _: &CreateStream) {
79        self.encode(&Null);
80    }
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn decode_create_stream() {
89        let mut buffer = ByteBuffer::default();
90        buffer.encode(&Null);
91        let result: IOResult<CreateStream> = buffer.decode();
92        assert!(result.is_ok());
93        let actual = result.unwrap();
94        let expected = CreateStream;
95        assert_eq!(expected, actual)
96    }
97
98    #[test]
99    fn encode_create_stream() {
100        let mut buffer = ByteBuffer::default();
101        let expected = CreateStream;
102        buffer.encode(&expected);
103        assert!(Decoder::<CreateStream>::decode(&mut buffer).is_ok())
104    }
105}