sheave_core/messages/
create_stream_result.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::{
11            Number,
12            Null
13        },
14        headers::MessageType
15    }
16};
17
18/// The response message for CreateStream requests.
19#[derive(Debug, Clone, Copy, PartialEq)]
20pub struct CreateStreamResult(Number);
21
22impl CreateStreamResult {
23    /// Constructs a CreateStreamResult command.
24    pub fn new(message_id: Number) -> Self {
25        Self(message_id)
26    }
27
28    /// Gets the message ID which is assigned to this stream.
29    pub fn get_message_id(&self) -> Number {
30        self.0
31    }
32}
33
34impl From<CreateStreamResult> for u32 {
35    fn from(create_stream_result: CreateStreamResult) -> Self {
36        create_stream_result.0.as_integer() as u32
37    }
38}
39
40impl ChunkData for CreateStreamResult {
41    const CHANNEL: Channel = Channel::System;
42    const MESSAGE_TYPE: MessageType = MessageType::Command;
43}
44
45impl Command for CreateStreamResult {}
46
47impl Decoder<CreateStreamResult> for ByteBuffer {
48    /// Decodes bytes into a CreateStreamResult command.
49    ///
50    /// # Errors
51    ///
52    /// * [`InsufficientBufferLength`]
53    ///
54    /// When some field misses.
55    ///
56    /// * [`InconsistentMarker`]
57    ///
58    /// When some value is inconsistent with its marker.
59    ///
60    /// # Examples
61    ///
62    /// ```rust
63    /// use sheave_core::{
64    ///     ByteBuffer,
65    ///     Decoder,
66    ///     Encoder,
67    ///     messages::{
68    ///         CreateStreamResult,
69    ///         amf::v0::{
70    ///             Number,
71    ///             Null
72    ///         }
73    ///     }
74    /// };
75    ///
76    /// let mut buffer = ByteBuffer::default();
77    /// buffer.encode(&Null);
78    /// buffer.encode(&Number::default());
79    /// assert!(Decoder::<CreateStreamResult>::decode(&mut buffer).is_ok());
80    ///
81    /// let mut buffer = ByteBuffer::default();
82    /// assert!(Decoder::<CreateStreamResult>::decode(&mut buffer).is_err())
83    /// ```
84    ///
85    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
86    /// [`InconsistentMarker`]: crate::messages::amf::InconsistentMarker
87    fn decode(&mut self) -> IOResult<CreateStreamResult> {
88        Decoder::<Null>::decode(self)?;
89        let message_id: Number = self.decode()?;
90        Ok(CreateStreamResult(message_id))
91    }
92}
93
94impl Encoder<CreateStreamResult> for ByteBuffer {
95    /// Encodes a CreateStreamResult command into bytes.
96    fn encode(&mut self, create_stream_result: &CreateStreamResult) {
97        self.encode(&Null);
98        self.encode(&create_stream_result.get_message_id());
99    }
100}
101
102#[cfg(test)]
103mod tests {
104    use super::*;
105
106    #[test]
107    fn decode_create_stream_result() {
108        let mut buffer = ByteBuffer::default();
109        buffer.encode(&Null);
110        buffer.encode(&Number::default());
111        let result: IOResult<CreateStreamResult> = buffer.decode();
112        assert!(result.is_ok());
113        let actual = result.unwrap();
114        let expected = CreateStreamResult::new(Number::default());
115        assert_eq!(expected, actual)
116    }
117
118    #[test]
119    fn encode_create_stream_result() {
120        let mut buffer = ByteBuffer::default();
121        let expected_message_id = 0f64;
122        buffer.encode(&CreateStreamResult::new(Number::new(expected_message_id)));
123        Decoder::<Null>::decode(&mut buffer).unwrap();
124        let actual_message_id: Number = buffer.decode().unwrap();
125        assert_eq!(expected_message_id, actual_message_id)
126    }
127}