use axum::http::HeaderMap;
#[must_use]
#[inline]
pub fn is_htmx_request(headers: &HeaderMap) -> bool {
headers
.get("HX-Request")
.and_then(|v| v.to_str().ok())
== Some("true")
}
#[macro_export]
macro_rules! middleware_constructors {
($middleware:ty, $agent:ty, $field:ident, $config:ty, $state_method:ident) => {
impl $middleware {
#[must_use]
pub fn new(state: &$crate::state::ActonHtmxState) -> Self {
Self {
$field: state.$state_method().clone(),
}
}
#[must_use]
pub fn with_config(state: &$crate::state::ActonHtmxState, _config: $config) -> Self {
Self::new(state)
}
#[must_use]
pub const fn from_handle(handle: acton_reactive::prelude::AgentHandle<$agent>) -> Self {
Self { $field: handle }
}
}
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_htmx_request_with_header() {
let mut headers = HeaderMap::new();
headers.insert("HX-Request", "true".parse().unwrap());
assert!(is_htmx_request(&headers));
}
#[test]
fn test_is_htmx_request_without_header() {
let headers = HeaderMap::new();
assert!(!is_htmx_request(&headers));
}
#[test]
fn test_is_htmx_request_with_wrong_value() {
let mut headers = HeaderMap::new();
headers.insert("HX-Request", "false".parse().unwrap());
assert!(!is_htmx_request(&headers));
}
#[test]
fn test_is_htmx_request_with_empty_value() {
let mut headers = HeaderMap::new();
headers.insert("HX-Request", "".parse().unwrap());
assert!(!is_htmx_request(&headers));
}
#[test]
fn test_is_htmx_request_case_sensitive() {
let mut headers = HeaderMap::new();
headers.insert("HX-Request", "True".parse().unwrap());
assert!(!is_htmx_request(&headers));
}
}