Skip to main content

moq_transport/message/
publish_namespace.rs

1use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs, TrackNamespace};
2
3/// Sent by the publisher to announce the availability of a group of tracks.
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct PublishNamespace {
6    /// The request ID
7    pub id: u64,
8
9    /// The track namespace
10    pub track_namespace: TrackNamespace,
11
12    /// Optional parameters
13    pub params: KeyValuePairs,
14}
15
16impl Decode for PublishNamespace {
17    fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
18        let id = u64::decode(r)?;
19        let track_namespace = TrackNamespace::decode(r)?;
20        let params = KeyValuePairs::decode(r)?;
21
22        Ok(Self {
23            id,
24            track_namespace,
25            params,
26        })
27    }
28}
29
30impl Encode for PublishNamespace {
31    fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
32        self.id.encode(w)?;
33        self.track_namespace.encode(w)?;
34        self.params.encode(w)?;
35
36        Ok(())
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43    use bytes::BytesMut;
44
45    #[test]
46    fn encode_decode() {
47        let mut buf = BytesMut::new();
48
49        // One parameter for testing
50        let mut kvps = KeyValuePairs::new();
51        kvps.set_bytesvalue(123, vec![0x00, 0x01, 0x02, 0x03]);
52
53        let msg = PublishNamespace {
54            id: 12345,
55            track_namespace: TrackNamespace::from_utf8_path("test/path/to/resource"),
56            params: kvps.clone(),
57        };
58        msg.encode(&mut buf).unwrap();
59        let decoded = PublishNamespace::decode(&mut buf).unwrap();
60        assert_eq!(decoded, msg);
61    }
62}