moq_lite/ietf/
track.rs

1//! IETF moq-transport-14 track status messages
2
3use std::borrow::Cow;
4
5use num_enum::{IntoPrimitive, TryFromPrimitive};
6
7use crate::{
8	coding::*,
9	ietf::{FilterType, GroupOrder, Message, Parameters, RequestId, Version},
10	Path,
11};
12
13use super::namespace::{decode_namespace, encode_namespace};
14
15/// TrackStatus message (0x0d)
16#[derive(Clone, Debug)]
17pub struct TrackStatus<'a> {
18	pub request_id: RequestId,
19	pub track_namespace: Path<'a>,
20	pub track_name: Cow<'a, str>,
21}
22
23impl<'a> Message for TrackStatus<'a> {
24	const ID: u64 = 0x0d;
25
26	fn encode_msg<W: bytes::BufMut>(&self, w: &mut W, version: Version) {
27		self.request_id.encode(w, version);
28		encode_namespace(w, &self.track_namespace, version);
29		self.track_name.encode(w, version);
30		0u8.encode(w, version); // subscriber priority
31		GroupOrder::Descending.encode(w, version);
32		false.encode(w, version); // forward
33		FilterType::LargestObject.encode(w, version); // filter type
34		0u8.encode(w, version); // no parameters
35	}
36
37	fn decode_msg<R: bytes::Buf>(r: &mut R, version: Version) -> Result<Self, DecodeError> {
38		let request_id = RequestId::decode(r, version)?;
39		let track_namespace = decode_namespace(r, version)?;
40		let track_name = Cow::<str>::decode(r, version)?;
41
42		let _subscriber_priority = u8::decode(r, version)?;
43		let _group_order = GroupOrder::decode(r, version)?;
44		let _forward = bool::decode(r, version)?;
45		let _filter_type = u64::decode(r, version)?;
46
47		// Ignore parameters, who cares.
48		let _params = Parameters::decode(r, version)?;
49
50		Ok(Self {
51			request_id,
52			track_namespace,
53			track_name,
54		})
55	}
56}
57
58#[derive(Clone, Copy, Debug, TryFromPrimitive, IntoPrimitive)]
59#[repr(u64)]
60pub enum TrackStatusCode {
61	InProgress = 0x00,
62	NotFound = 0x01,
63	NotAuthorized = 0x02,
64	Ended = 0x03,
65}
66
67impl<V> Encode<V> for TrackStatusCode {
68	fn encode<W: bytes::BufMut>(&self, w: &mut W, version: V) {
69		u64::from(*self).encode(w, version);
70	}
71}
72
73impl<V> Decode<V> for TrackStatusCode {
74	fn decode<R: bytes::Buf>(r: &mut R, version: V) -> Result<Self, DecodeError> {
75		Self::try_from(u64::decode(r, version)?).map_err(|_| DecodeError::InvalidValue)
76	}
77}