rtsp_types/headers/
pipelined_requests.rs

1// Copyright (C) 2020 Sebastian Dröge <sebastian@centricular.com>
2//
3// Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>
4
5use super::*;
6
7/// `Pipelined-Requests` header ([RFC 7826 section 18.33](https://tools.ietf.org/html/rfc7826#section-18.33)).
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub struct PipelinedRequests(u32);
11
12impl std::ops::Deref for PipelinedRequests {
13    type Target = u32;
14
15    fn deref(&self) -> &Self::Target {
16        &self.0
17    }
18}
19
20impl std::ops::DerefMut for PipelinedRequests {
21    fn deref_mut(&mut self) -> &mut Self::Target {
22        &mut self.0
23    }
24}
25
26impl AsRef<u32> for PipelinedRequests {
27    fn as_ref(&self) -> &u32 {
28        &self.0
29    }
30}
31
32impl AsMut<u32> for PipelinedRequests {
33    fn as_mut(&mut self) -> &mut u32 {
34        &mut self.0
35    }
36}
37
38impl From<u32> for PipelinedRequests {
39    fn from(v: u32) -> PipelinedRequests {
40        PipelinedRequests(v)
41    }
42}
43
44impl From<PipelinedRequests> for u32 {
45    fn from(v: PipelinedRequests) -> u32 {
46        v.0
47    }
48}
49
50impl super::TypedHeader for PipelinedRequests {
51    fn from_headers(headers: impl AsRef<Headers>) -> Result<Option<Self>, HeaderParseError> {
52        let headers = headers.as_ref();
53
54        let header = match headers.get(&PIPELINED_REQUESTS) {
55            None => return Ok(None),
56            Some(header) => header,
57        };
58
59        let cseq = header
60            .as_str()
61            .parse::<u32>()
62            .map(PipelinedRequests)
63            .map_err(|_| HeaderParseError)?;
64
65        Ok(Some(cseq))
66    }
67
68    fn insert_into(&self, mut headers: impl AsMut<Headers>) {
69        let headers = headers.as_mut();
70
71        headers.insert(PIPELINED_REQUESTS, self.0.to_string());
72    }
73}