sheave_core/messages/
delete_stream.rs

1use std::io::Result as IOResult;
2use super::{
3    Channel,
4    ChunkData,
5    Command,
6    headers::MessageType
7};
8use crate::{
9    Decoder,
10    Encoder,
11    ByteBuffer,
12    messages::amf::v0::{
13        Number,
14        Null
15    }
16};
17
18/// The command to request to delete its message ID.
19#[derive(Debug, Clone, Copy, PartialEq)]
20pub struct DeleteStream(Number);
21
22impl DeleteStream {
23    /// Constructs a DeleteStream command.
24    pub fn new(message_id: Number) -> Self {
25        Self(message_id)
26    }
27
28    /// Gets the message ID.
29    pub fn get_message_id(&self) -> Number {
30        self.0
31    }
32}
33
34impl From<DeleteStream> for u32 {
35    fn from(delete_stream: DeleteStream) -> Self {
36        delete_stream.0.as_integer() as u32
37    }
38}
39
40impl ChunkData for DeleteStream {
41    const CHANNEL: Channel = Channel::System;
42    const MESSAGE_TYPE: MessageType = MessageType::Command;
43}
44
45impl Command for DeleteStream {}
46
47impl Decoder<DeleteStream> for ByteBuffer {
48    /// Decodes bytes into a DeleteStream 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    ///         DeleteStream,
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::<DeleteStream>::decode(&mut buffer).is_ok());
80    ///
81    /// let mut buffer = ByteBuffer::default();
82    /// assert!(Decoder::<DeleteStream>::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<DeleteStream> {
88        Decoder::<Null>::decode(self)?;
89        let message_id: Number = self.decode()?;
90
91        Ok(DeleteStream(message_id))
92    }
93}
94
95impl Encoder<DeleteStream> for ByteBuffer {
96    /// Encodes a DeleteStream command into bytes.
97    fn encode(&mut self, delete_stream: &DeleteStream) {
98        self.encode(&Null);
99        self.encode(&delete_stream.get_message_id());
100    }
101}
102
103#[cfg(test)]
104mod tests {
105    use super::*;
106
107    #[test]
108    fn decode_delete_stream() {
109        let mut buffer = ByteBuffer::default();
110        buffer.encode(&Null);
111        buffer.encode(&Number::default());
112
113        let result: IOResult<DeleteStream> = buffer.decode();
114        assert!(result.is_ok());
115        let actual = result.unwrap();
116        let expected = DeleteStream::new(Number::default());
117        assert_eq!(expected, actual)
118    }
119
120    #[test]
121    fn encode_delete_stream() {
122        let mut buffer = ByteBuffer::default();
123        let expected_message_id = 0f64;
124        let expected = DeleteStream::new(Number::new(expected_message_id));
125        buffer.encode(&expected);
126        Decoder::<Null>::decode(&mut buffer).unwrap();
127        let actual_message_id: Number = buffer.decode().unwrap();
128        assert_eq!(expected_message_id, actual_message_id)
129    }
130}