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}