rtsp_types/headers/
seek_style.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
7use std::fmt;
8
9/// `Seek-Style` header ([RFC 7826 section 18.47](https://tools.ietf.org/html/rfc7826#section-18.47)).
10#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12pub enum SeekStyle {
13    Rap,
14    CoRap,
15    FirstPrior,
16    Next,
17    Extension(String),
18}
19
20impl SeekStyle {
21    pub fn as_str(&self) -> &str {
22        match self {
23            SeekStyle::Rap => "RAP",
24            SeekStyle::CoRap => "CoRAP",
25            SeekStyle::FirstPrior => "First-Prior",
26            SeekStyle::Next => "Next",
27            SeekStyle::Extension(ref s) => s.as_str(),
28        }
29    }
30}
31
32impl fmt::Display for SeekStyle {
33    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34        f.write_str(self.as_str())
35    }
36}
37
38impl std::str::FromStr for SeekStyle {
39    type Err = HeaderParseError;
40
41    fn from_str(s: &str) -> Result<Self, HeaderParseError> {
42        match s {
43            "RAP" => Ok(SeekStyle::Rap),
44            "CoRAP" => Ok(SeekStyle::CoRap),
45            "First-Prior" => Ok(SeekStyle::FirstPrior),
46            "Next" => Ok(SeekStyle::Next),
47            _ => Ok(SeekStyle::Extension(String::from(s))),
48        }
49    }
50}
51
52impl super::TypedHeader for SeekStyle {
53    fn from_headers(headers: impl AsRef<Headers>) -> Result<Option<Self>, HeaderParseError> {
54        let headers = headers.as_ref();
55
56        let header = match headers.get(&SEEK_STYLE) {
57            None => return Ok(None),
58            Some(header) => header,
59        };
60
61        let seek_style = header.as_str().parse().map_err(|_| HeaderParseError)?;
62
63        Ok(Some(seek_style))
64    }
65
66    fn insert_into(&self, mut headers: impl AsMut<Headers>) {
67        let headers = headers.as_mut();
68
69        headers.insert(SEEK_STYLE, self.to_string());
70    }
71}