use axum::response::sse::Event;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HtmxSwap {
InnerHtml,
OuterHtml,
BeforeBegin,
AfterBegin,
BeforeEnd,
AfterEnd,
Delete,
None,
}
impl HtmxSwap {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::InnerHtml => "innerHTML",
Self::OuterHtml => "outerHTML",
Self::BeforeBegin => "beforebegin",
Self::AfterBegin => "afterbegin",
Self::BeforeEnd => "beforeend",
Self::AfterEnd => "afterend",
Self::Delete => "delete",
Self::None => "none",
}
}
}
pub fn htmx_event(event_name: &str, html: impl Into<String>) -> Event {
Event::default().event(event_name).data(html.into())
}
pub fn htmx_json_event<T: Serialize>(
event_name: &str,
data: &T,
) -> Result<Event, serde_json::Error> {
let json = serde_json::to_string(data)?;
Ok(Event::default().event(event_name).data(json))
}
pub fn htmx_close_event() -> Event {
Event::default().event("htmx:closeSSE").data("")
}
pub fn htmx_trigger(trigger_name: &str) -> Event {
Event::default().event("htmx:trigger").data(trigger_name)
}
pub fn htmx_oob_event(event_name: &str, html: impl Into<String>) -> Event {
Event::default().event(event_name).data(html.into())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_htmx_swap_as_str() {
assert_eq!(HtmxSwap::InnerHtml.as_str(), "innerHTML");
assert_eq!(HtmxSwap::OuterHtml.as_str(), "outerHTML");
assert_eq!(HtmxSwap::BeforeBegin.as_str(), "beforebegin");
assert_eq!(HtmxSwap::Delete.as_str(), "delete");
}
#[test]
fn test_htmx_event() {
let _event = htmx_event("message", "<p>Hello</p>");
}
#[test]
fn test_htmx_close_event() {
let _event = htmx_close_event();
}
#[test]
fn test_htmx_trigger() {
let _event = htmx_trigger("refreshList");
}
#[derive(Serialize)]
struct TestData {
count: i32,
}
#[test]
fn test_htmx_json_event() {
let result = htmx_json_event("data", &TestData { count: 42 });
assert!(result.is_ok());
}
}