use std::convert::Infallible; use rocket::{ request::{self, FromRequest}, Request, }; macro_rules! header { ($name:ident, $header:expr) => { header!($name, $header, String, |header| header.to_owned()); }; ($name:ident, $header:expr, $type:ty, $handler:expr) => { pub struct $name(pub Option<$type>); #[rocket::async_trait] impl<'r> FromRequest<'r> for $name { type Error = Infallible; async fn from_request(req: &'r Request<'_>) -> request::Outcome { let header = req.headers().get_one($header); request::Outcome::Success(Self(header.map($handler))) } } }; } header!(Referer, "Referer"); header!(AcceptLanguage, "Accept-Language", Vec, |header| { accept_language::parse(header) });