scuffle_rtmp/command_messages/on_status/
writer.rs

1//! Writing [`OnStatus`].
2
3use std::io;
4
5use scuffle_amf0::encoder::Amf0Encoder;
6
7use super::OnStatus;
8use crate::command_messages::error::CommandError;
9
10impl OnStatus<'_> {
11    /// Writes an [`OnStatus`] command to the given writer.
12    pub fn write(self, buf: &mut impl io::Write, transaction_id: f64) -> Result<(), CommandError> {
13        let mut encoder = Amf0Encoder::new(buf);
14
15        encoder.encode_string("onStatus")?;
16        encoder.encode_number(transaction_id)?;
17        // command object is null
18        encoder.encode_null()?;
19        encoder.serialize(self)?;
20
21        Ok(())
22    }
23}
24
25#[cfg(test)]
26#[cfg_attr(all(test, coverage_nightly), coverage(off))]
27mod tests {
28    use bytes::{BufMut, BytesMut};
29    use scuffle_amf0::Amf0Value;
30    use scuffle_amf0::decoder::Amf0Decoder;
31
32    use crate::command_messages::CommandResultLevel;
33    use crate::command_messages::on_status::OnStatus;
34
35    #[test]
36    fn test_write_on_status() {
37        let mut buf = BytesMut::new();
38
39        OnStatus {
40            level: CommandResultLevel::Status,
41            code: "idk".into(),
42            description: Some("description".into()),
43            others: Some(
44                [("testkey".into(), Amf0Value::String("testvalue".into()))]
45                    .into_iter()
46                    .collect(),
47            ),
48        }
49        .write(&mut (&mut buf).writer(), 1.0)
50        .expect("write");
51
52        let values = Amf0Decoder::from_buf(buf.freeze()).decode_all().unwrap();
53
54        assert_eq!(values.len(), 4);
55        assert_eq!(values[0], Amf0Value::String("onStatus".into())); // command name
56        assert_eq!(values[1], Amf0Value::Number(1.0)); // transaction id
57        assert_eq!(values[2], Amf0Value::Null); // command object
58        assert_eq!(
59            values[3],
60            Amf0Value::Object(
61                [
62                    ("level".into(), Amf0Value::String("status".into())),
63                    ("code".into(), Amf0Value::String("idk".into())),
64                    ("description".into(), Amf0Value::String("description".into())),
65                    ("testkey".into(), Amf0Value::String("testvalue".into())),
66                ]
67                .into_iter()
68                .collect()
69            )
70        ); // info object
71    }
72}