use super::{IntoResponse, IntoResponseParts, ResponseParts, TryIntoHeaderError};
use crate::{HeaderName, HeaderValue};
use rama_http_types::Response;
use rama_utils::macros::impl_deref;
use std::fmt;
pub struct AppendHeaders<I>(pub I);
impl<I: fmt::Debug> fmt::Debug for AppendHeaders<I> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("AppendHeaders").field(&self.0).finish()
}
}
impl<I: Clone> Clone for AppendHeaders<I> {
fn clone(&self) -> Self {
Self(self.0.clone())
}
}
impl_deref!(AppendHeaders);
impl<I, K, V> IntoResponse for AppendHeaders<I>
where
I: IntoIterator<Item = (K, V)>,
K: TryInto<HeaderName, Error: fmt::Display>,
V: TryInto<HeaderValue, Error: fmt::Display>,
{
fn into_response(self) -> Response {
(self, ()).into_response()
}
}
impl<I, K, V> IntoResponseParts for AppendHeaders<I>
where
I: IntoIterator<Item = (K, V)>,
K: TryInto<HeaderName, Error: fmt::Display>,
V: TryInto<HeaderValue, Error: fmt::Display>,
{
type Error = TryIntoHeaderError<K::Error, V::Error>;
fn into_response_parts(self, mut res: ResponseParts) -> Result<ResponseParts, Self::Error> {
for (key, value) in self.0 {
let key = key.try_into().map_err(TryIntoHeaderError::key)?;
let value = value.try_into().map_err(TryIntoHeaderError::value)?;
res.headers_mut().append(key, value);
}
Ok(res)
}
}