use std::iter::once;
#[cfg(feature = "axum")]
use axum_core::response::{IntoResponse, IntoResponseParts, Response, ResponseParts};
#[cfg(feature = "axum")]
use axum_extra::TypedHeader;
use headers_core::{Error, Header, HeaderName, HeaderValue};
use crate::util::iter::IterExt;
static HX_REFRESH: HeaderName = HeaderName::from_static("hx-refresh");
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct HxRefresh;
#[cfg(feature = "axum")]
#[cfg_attr(docsrs, doc(cfg(feature = "axum")))]
impl IntoResponseParts for HxRefresh {
type Error = <TypedHeader<Self> as IntoResponseParts>::Error;
fn into_response_parts(self, res: ResponseParts) -> Result<ResponseParts, Self::Error> {
TypedHeader(self).into_response_parts(res)
}
}
#[cfg(feature = "axum")]
#[cfg_attr(docsrs, doc(cfg(feature = "axum")))]
impl IntoResponse for HxRefresh {
fn into_response(self) -> Response {
TypedHeader(self).into_response()
}
}
impl Header for HxRefresh {
fn name() -> &'static HeaderName {
&HX_REFRESH
}
fn decode<'i, I>(values: &mut I) -> Result<Self, Error>
where
Self: Sized,
I: Iterator<Item = &'i HeaderValue>,
{
values
.just_one()
.and_then(|value| if value == "true" { Some(Self) } else { None })
.ok_or_else(Error::invalid)
}
fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
values.extend(once(HeaderValue::from_static("true")));
}
}