poem_openapi/param/
header.rs1use std::ops::{Deref, DerefMut};
2
3use poem::{Request, RequestBody, Result};
4
5use crate::{
6 error::ParseParamError,
7 registry::{MetaParamIn, MetaSchemaRef, Registry},
8 types::ParseFromParameter,
9 ApiExtractor, ApiExtractorType, ExtractParamOptions,
10};
11
12pub struct Header<T>(pub T);
14
15impl<T> Deref for Header<T> {
16 type Target = T;
17
18 fn deref(&self) -> &Self::Target {
19 &self.0
20 }
21}
22
23impl<T> DerefMut for Header<T> {
24 fn deref_mut(&mut self) -> &mut Self::Target {
25 &mut self.0
26 }
27}
28
29impl<'a, T: ParseFromParameter> ApiExtractor<'a> for Header<T> {
30 const TYPES: &'static [ApiExtractorType] = &[ApiExtractorType::Parameter];
31 const PARAM_IS_REQUIRED: bool = T::IS_REQUIRED;
32
33 type ParamType = T;
34 type ParamRawType = T::RawValueType;
35
36 fn register(registry: &mut Registry) {
37 T::register(registry);
38 }
39
40 fn param_in() -> Option<MetaParamIn> {
41 Some(MetaParamIn::Header)
42 }
43
44 fn param_schema_ref() -> Option<MetaSchemaRef> {
45 Some(T::schema_ref())
46 }
47
48 fn param_raw_type(&self) -> Option<&Self::ParamRawType> {
49 self.0.as_raw_value()
50 }
51
52 async fn from_request(
53 request: &'a Request,
54 _body: &mut RequestBody,
55 param_opts: ExtractParamOptions<Self::ParamType>,
56 ) -> Result<Self> {
57 let mut values = request
58 .headers()
59 .get_all(param_opts.name)
60 .iter()
61 .filter_map(|value| value.to_str().ok())
62 .peekable();
63
64 match ¶m_opts.default_value {
65 Some(default_value) if values.peek().is_none() => {
66 return Ok(Self(default_value()));
67 }
68 _ => {}
69 }
70
71 ParseFromParameter::parse_from_parameters(values)
72 .map(Self)
73 .map_err(|err| {
74 ParseParamError {
75 name: param_opts.name,
76 reason: err.into_message(),
77 }
78 .into()
79 })
80 }
81}