dioxus_fullstack/payloads/
header.rs1use super::*;
2
3pub use headers::Cookie;
4pub use headers::SetCookie;
5
6#[derive(Clone, Debug)]
7pub struct SetHeader<Data> {
8 data: Option<Data>,
9}
10
11impl<T: Header> SetHeader<T> {
12 pub fn new(
13 value: impl TryInto<HeaderValue, Error = InvalidHeaderValue>,
14 ) -> Result<Self, headers::Error> {
15 let values = value.try_into().map_err(|_| headers::Error::invalid())?;
16
17 let res = T::decode(&mut std::iter::once(&values))?;
18
19 Ok(Self { data: Some(res) })
20 }
21}
22
23impl<T: Header> IntoResponseParts for SetHeader<T> {
24 type Error = ();
25
26 fn into_response_parts(self, res: ResponseParts) -> Result<ResponseParts, Self::Error> {
27 let data = self.data.expect("SetHeader must have data to set");
28
29 let mut headers = vec![];
30 data.encode(&mut headers);
31
32 Ok(axum::response::AppendHeaders(
33 headers.into_iter().map(|value| (T::name().clone(), value)),
34 )
35 .into_response_parts(res)
36 .unwrap())
37 }
38}
39
40impl<T: Header> FromResponseParts for SetHeader<T> {
41 fn from_response_parts(parts: &mut axum::http::response::Parts) -> Result<Self, ServerFnError> {
42 let Some(header) = parts.headers.remove(T::name()) else {
43 return Ok(SetHeader { data: None });
44 };
45
46 let data = T::decode(&mut std::iter::once(&header))
47 .map_err(|_| ServerFnError::Deserialization("Failed to decode header".into()))?;
48
49 Ok(SetHeader { data: Some(data) })
50 }
51}
52
53impl<T: Header> IntoResponse for SetHeader<T> {
54 fn into_response(self) -> axum::response::Response {
55 let mut values = vec![];
56 self.data.unwrap().encode(&mut values);
57
58 let mut response = axum::response::Response::builder();
59
60 for value in values {
61 response = response.header(T::name(), value);
62 }
63
64 response.body(axum_core::body::Body::empty()).unwrap()
65 }
66}