ftth_rsip/headers/typed/
warning.rs

1#[doc(hidden)]
2pub use super::tokenizers::WarningTokenizer as Tokenizer;
3
4use crate::common::Uri;
5use rsip_derives::TypedHeader;
6use std::convert::{TryFrom, TryInto};
7
8/// The `Record-Warning` header in its [typed](super) form.
9#[derive(TypedHeader, Eq, PartialEq, Clone, Debug)]
10pub struct Warning {
11    pub code: u16,
12    pub uri: Uri,
13    pub text: String,
14}
15
16impl<'a> TryFrom<Tokenizer<'a>> for Warning {
17    type Error = crate::Error;
18
19    fn try_from(tokenizer: Tokenizer) -> Result<Self, Self::Error> {
20        Ok(Self {
21            code: tokenizer.code.parse::<u16>()?,
22            uri: Uri {
23                host_with_port: tokenizer.host.try_into()?,
24                ..Default::default()
25            },
26            text: tokenizer.text.into(),
27        })
28    }
29}
30
31impl std::fmt::Display for Warning {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        if self.text.starts_with('"') && self.text.ends_with('"') {
34            write!(f, "{} {} {}", self.code, self.uri, self.text)
35        } else {
36            write!(f, "{} {} \"{}\"", self.code, self.uri, self.text)
37        }
38    }
39}