mco_http/header/common/
preference_applied.rs1use std::fmt;
2use crate::header::{Header, HeaderFormat, Preference};
3use crate::header::parsing::{from_comma_delimited, fmt_comma_delimited};
4
5#[derive(PartialEq, Clone, Debug)]
47pub struct PreferenceApplied(pub Vec<Preference>);
48
49__mco_http__deref!(PreferenceApplied => Vec<Preference>);
50
51impl Header for PreferenceApplied {
52 fn header_name() -> &'static str {
53 "Preference-Applied"
54 }
55
56 fn parse_header(raw: &[Vec<u8>]) -> crate::Result<PreferenceApplied> {
57 let preferences = from_comma_delimited(raw)?;
58 if !preferences.is_empty() {
59 Ok(PreferenceApplied(preferences))
60 } else {
61 Err(crate::Error::Header)
62 }
63 }
64}
65
66impl HeaderFormat for PreferenceApplied {
67 fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
68 fmt::Display::fmt(self, f)
69 }
70}
71
72impl fmt::Display for PreferenceApplied {
73 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
74 let preferences: Vec<_> = self.0.iter().map(|pref| match pref {
76 &Preference::Extension(ref name, ref value, _) => Preference::Extension(
78 name.to_owned(),
79 value.to_owned(),
80 vec![]
81 ),
82 preference @ _ => preference.clone()
83 }).collect();
84 fmt_comma_delimited(f, &preferences)
85 }
86}
87
88#[cfg(test)]
89mod tests {
90 use crate::header::{HeaderFormat, Preference};
91 use super::*;
92
93 #[test]
94 fn test_format_ignore_parameters() {
95 assert_eq!(
96 format!("{}", &PreferenceApplied(vec![Preference::Extension(
97 "foo".to_owned(),
98 "bar".to_owned(),
99 vec![("bar".to_owned(), "foo".to_owned()), ("buz".to_owned(), "".to_owned())]
100 )]) as &(dyn HeaderFormat + Send + Sync)),
101 "foo=bar".to_owned()
102 );
103 }
104}
105
106bench_header!(normal,
107 PreferenceApplied, { vec![b"respond-async, return=representation".to_vec(), b"wait=100".to_vec()] });