sheave_core/messages/
get_stream_length_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 GetStreamLength requests.
19///
20/// Note this command name starts with GetStreamLength but actual input is a duration in seconds.
21#[derive(Debug, Clone, Copy, PartialEq)]
22pub struct GetStreamLengthResult(Number);
23
24impl GetStreamLengthResult {
25    /// Constructs a GetStreamLengthResult command.
26    pub fn new(duration: Number) -> Self {
27        Self(duration)
28    }
29
30    /// Gets the duration.
31    pub fn get_duration(&self) -> Number {
32        self.0
33    }
34}
35
36impl ChunkData for GetStreamLengthResult {
37    const CHANNEL: Channel = Channel::Source;
38    const MESSAGE_TYPE: MessageType = MessageType::Command;
39}
40
41impl Command for GetStreamLengthResult {}
42
43impl Decoder<GetStreamLengthResult> for ByteBuffer {
44    /// Decodes bytes into a GetStreamLengthResult command.
45    ///
46    /// # Errors
47    ///
48    /// * [`InsufficientBufferLength`]
49    ///
50    /// When some field misses.
51    ///
52    /// * [`InconsistentMarker`]
53    ///
54    /// When some value is inconsistent with its marker.
55    ///
56    /// # Examples
57    ///
58    /// ```rust
59    /// use sheave_core::{
60    ///     ByteBuffer,
61    ///     Decoder,
62    ///     Encoder,
63    ///     messages::{
64    ///         GetStreamLengthResult,
65    ///         amf::v0::{
66    ///             Number,
67    ///             Null
68    ///         }
69    ///     }
70    /// };
71    ///
72    /// let mut buffer = ByteBuffer::default();
73    /// buffer.encode(&Null);
74    /// buffer.encode(&Number::default());
75    /// assert!(Decoder::<GetStreamLengthResult>::decode(&mut buffer).is_ok());
76    ///
77    /// let mut buffer = ByteBuffer::default();
78    /// assert!(Decoder::<GetStreamLengthResult>::decode(&mut buffer).is_err())
79    /// ```
80    ///
81    /// [`InsufficientBufferLength`]: crate::byte_buffer::InsufficientBufferLength
82    /// [`InconsistentMarker`]: crate::messages::amf::InconsistentMarker
83    fn decode(&mut self) -> IOResult<GetStreamLengthResult> {
84        Decoder::<Null>::decode(self)?;
85        let duration: Number = self.decode()?;
86        Ok(GetStreamLengthResult(duration))
87    }
88}
89
90impl Encoder<GetStreamLengthResult> for ByteBuffer {
91    /// Encodes a GetStreamLengthResult command into bytes.
92    fn encode(&mut self, get_stream_length_result: &GetStreamLengthResult) {
93        self.encode(&Null);
94        self.encode(&get_stream_length_result.get_duration());
95    }
96}
97
98#[cfg(test)]
99mod tests {
100    use super::*;
101
102    #[test]
103    fn decode_get_stream_length_result() {
104        let mut buffer = ByteBuffer::default();
105        buffer.encode(&Null);
106        buffer.encode(&Number::default());
107        let result: IOResult<GetStreamLengthResult> = buffer.decode();
108        assert!(result.is_ok());
109        let actual = result.unwrap();
110        let expected = GetStreamLengthResult::new(Nmber::default());
111        assert_eq!(expected, actual)
112    }
113
114    #[test]
115    fn encode_get_stream_length_result() {
116        let mut buffer = ByteBuffer::default();
117        let expected_duration = 0f64;
118        buffer.encode(&GetStreamLengthResult::new(Number::new(expected_duration)));
119        Decoder::<Null>::decode(&mut buffer).unwrap();
120        let actual_duration: Number = buffer.decode().unwrap();
121        assert_eq!(expected_duration, actual_duration)
122    }
123}