rtsp_types/headers/
content_length.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/// `Content-Length` header ([RFC 7826 section 18.17](https://tools.ietf.org/html/rfc7826#section-18.17)).
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub struct ContentLength(u64);
11
12impl std::ops::Deref for ContentLength {
13    type Target = u64;
14
15    fn deref(&self) -> &Self::Target {
16        &self.0
17    }
18}
19
20impl std::ops::DerefMut for ContentLength {
21    fn deref_mut(&mut self) -> &mut Self::Target {
22        &mut self.0
23    }
24}
25
26impl AsRef<u64> for ContentLength {
27    fn as_ref(&self) -> &u64 {
28        &self.0
29    }
30}
31
32impl AsMut<u64> for ContentLength {
33    fn as_mut(&mut self) -> &mut u64 {
34        &mut self.0
35    }
36}
37
38impl From<u64> for ContentLength {
39    fn from(v: u64) -> ContentLength {
40        ContentLength(v)
41    }
42}
43
44impl From<ContentLength> for u64 {
45    fn from(v: ContentLength) -> u64 {
46        v.0
47    }
48}
49
50impl super::TypedHeader for ContentLength {
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(&CONTENT_LENGTH) {
55            None => return Ok(None),
56            Some(header) => header,
57        };
58
59        let length = header
60            .as_str()
61            .parse::<u64>()
62            .map(ContentLength)
63            .map_err(|_| HeaderParseError)?;
64
65        Ok(Some(length))
66    }
67
68    fn insert_into(&self, mut headers: impl AsMut<Headers>) {
69        let headers = headers.as_mut();
70
71        headers.insert(CONTENT_LENGTH, self.0.to_string());
72    }
73}