1use 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#[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); GroupOrder::Descending.encode(w, version);
32 false.encode(w, version); FilterType::LargestObject.encode(w, version); 0u8.encode(w, version); }
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 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}