use std::{fmt, ops}; use futures_util::future::{err, ok, Ready}; use crate::dev::Payload; use crate::error::ParseError; use crate::extract::FromRequest; use crate::http::header; use crate::HttpRequest; /// Header extractor and responder. pub struct Header(pub T); impl Header { /// Unwrap into inner `T` value. pub fn into_inner(self) -> T { self.0 } } impl ops::Deref for Header { type Target = T; fn deref(&self) -> &T { &self.0 } } impl ops::DerefMut for Header { fn deref_mut(&mut self) -> &mut T { &mut self.0 } } impl fmt::Debug for Header where T: fmt::Debug, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Header: {:?}", self.0) } } impl fmt::Display for Header where T: fmt::Display, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(&self.0, f) } } /// See [here](#extractor) for example of usage as an extractor. impl FromRequest for Header where T: header::Header, { type Error = ParseError; type Future = Ready>; type Config = (); #[inline] fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future { match header::Header::parse(req) { Ok(header) => ok(Header(header)), Err(e) => err(e), } } }