Skip to main content

moq_transport/message/
subscribe_namespace.rs

1use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs, TrackNamespace};
2
3/// Subscribe Namespace
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub struct SubscribeNamespace {
6    /// The subscription request ID
7    pub id: u64,
8
9    /// The track namespace prefix
10    pub track_namespace_prefix: TrackNamespace,
11
12    /// Optional parameters
13    pub params: KeyValuePairs,
14}
15
16impl Decode for SubscribeNamespace {
17    fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
18        let id = u64::decode(r)?;
19        let track_namespace_prefix = TrackNamespace::decode(r)?;
20        let params = KeyValuePairs::decode(r)?;
21
22        Ok(Self {
23            id,
24            track_namespace_prefix,
25            params,
26        })
27    }
28}
29
30impl Encode for SubscribeNamespace {
31    fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
32        self.id.encode(w)?;
33        self.track_namespace_prefix.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 = SubscribeNamespace {
54            id: 12345,
55            track_namespace_prefix: TrackNamespace::from_utf8_path("path/prefix"),
56            params: kvps,
57        };
58        msg.encode(&mut buf).unwrap();
59        let decoded = SubscribeNamespace::decode(&mut buf).unwrap();
60        assert_eq!(decoded, msg);
61    }
62}