actix_htmx/
trigger_payload.rs

1use serde::Serialize;
2use serde_json::{to_value, Value};
3
4/// A strongly typed payload for HX-Trigger* headers.
5///
6/// Construct instances through helper constructors, then pass them to
7/// [`Htmx::trigger_event`](crate::Htmx::trigger_event)
8/// to make sure payloads are always valid JSON.
9#[derive(Clone, Debug)]
10pub struct TriggerPayload {
11    inner: Value,
12}
13
14impl TriggerPayload {
15    /// Create a payload from any serializable value.
16    pub fn json<T>(value: T) -> serde_json::Result<Self>
17    where
18        T: Serialize,
19    {
20        to_value(value).map(Self::from_value)
21    }
22
23    /// Create a payload directly from a `serde_json::Value`.
24    pub fn from_value(value: Value) -> Self {
25        TriggerPayload { inner: value }
26    }
27
28    /// Convenience helper for string payloads.
29    pub fn text(value: impl Into<String>) -> Self {
30        TriggerPayload::from_value(Value::String(value.into()))
31    }
32
33    /// Convenience helper for boolean payloads.
34    pub fn boolean(value: bool) -> Self {
35        TriggerPayload::from_value(Value::Bool(value))
36    }
37
38    /// Convenience helper for numeric payloads.
39    pub fn number<N>(value: N) -> serde_json::Result<Self>
40    where
41        N: Serialize,
42    {
43        TriggerPayload::json(value)
44    }
45
46    pub(crate) fn as_json_value(&self) -> Value {
47        self.inner.clone()
48    }
49}