headers/common/
access_control_allow_methods.rs
1use std::iter::FromIterator;
2
3use http::Method;
4
5use util::FlatCsv;
6
7#[derive(Clone, Debug, PartialEq)]
36pub struct AccessControlAllowMethods(FlatCsv);
37
38derive_header! {
39 AccessControlAllowMethods(_),
40 name: ACCESS_CONTROL_ALLOW_METHODS
41}
42
43impl AccessControlAllowMethods {
44 pub fn iter<'a>(&'a self) -> impl Iterator<Item = Method> + 'a {
46 self.0.iter().filter_map(|s| s.parse().ok())
47 }
48}
49
50impl FromIterator<Method> for AccessControlAllowMethods {
51 fn from_iter<I>(iter: I) -> Self
52 where
53 I: IntoIterator<Item = Method>,
54 {
55 let methods = iter
56 .into_iter()
57 .map(|method| {
58 method
59 .as_str()
60 .parse::<::HeaderValue>()
61 .expect("Method is a valid HeaderValue")
62 })
63 .collect();
64
65 AccessControlAllowMethods(methods)
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::super::{test_decode, test_encode};
72 use super::*;
73
74 #[test]
75 fn iter() {
76 let allowed = test_decode::<AccessControlAllowMethods>(&["GET, PUT"]).unwrap();
77
78 let as_vec = allowed.iter().collect::<Vec<_>>();
79 assert_eq!(as_vec.len(), 2);
80 assert_eq!(as_vec[0], Method::GET);
81 assert_eq!(as_vec[1], Method::PUT);
82 }
83
84 #[test]
85 fn from_iter() {
86 let allow: AccessControlAllowMethods = vec![Method::GET, Method::PUT].into_iter().collect();
87
88 let headers = test_encode(allow);
89 assert_eq!(headers["access-control-allow-methods"], "GET, PUT");
90 }
91}