use serde::{de::DeserializeOwned, Serialize};
pub fn decode_state<T: DeserializeOwned>(json: &str) -> Option<T> {
serde_json::from_str(json).ok()
}
pub(crate) fn state_init_script<T: Serialize>(state: &T) -> String {
let json = serde_json::to_string(state).expect("state must be serializable");
format!(
"<script id=\"_state\" type=\"application/json\">{}</script>\
<script>\
document.addEventListener('htmx:configRequest',function(e){{\
var el=document.getElementById('_state');\
if(el)e.detail.parameters['_state']=el.textContent}})\
</script>",
json
)
}
pub(crate) fn state_update_script<T: Serialize>(state: &T) -> String {
let json = serde_json::to_string(state).expect("state must be serializable");
format!(
"<script id=\"_state\" type=\"application/json\" hx-swap-oob=\"true\">{}</script>",
json
)
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct TestState {
count: u32,
name: String,
}
#[test]
fn round_trip() {
let state = TestState {
count: 42,
name: "hello world".to_string(),
};
let json = serde_json::to_string(&state).unwrap();
let decoded: TestState = decode_state(&json).unwrap();
assert_eq!(state, decoded);
}
}