use serde::Serialize;
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize)]
pub struct PageObject {
pub component: String,
pub props: Value,
pub url: String,
pub version: String,
#[serde(rename = "encryptHistory", skip_serializing_if = "is_false")]
pub encrypt_history: bool,
#[serde(rename = "clearHistory", skip_serializing_if = "is_false")]
pub clear_history: bool,
#[serde(rename = "mergeProps", skip_serializing_if = "Vec::is_empty")]
pub merge_props: Vec<String>,
#[serde(rename = "resetMergeProps", skip_serializing_if = "Vec::is_empty")]
pub reset_merge_props: Vec<String>,
#[serde(rename = "deferredProps", skip_serializing_if = "BTreeMap::is_empty")]
pub deferred_props: BTreeMap<String, Vec<String>>,
}
fn is_false(b: &bool) -> bool {
!*b
}
impl PageObject {
pub fn new(
component: impl Into<String>,
props: Value,
url: impl Into<String>,
version: impl Into<String>,
) -> Self {
Self {
component: component.into(),
props,
url: url.into(),
version: version.into(),
encrypt_history: false,
clear_history: false,
merge_props: Vec::new(),
reset_merge_props: Vec::new(),
deferred_props: BTreeMap::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn minimal_page_serializes_with_only_required_fields() {
let p = PageObject::new("Home", json!({"msg": "hi"}), "/", "v1");
let v = serde_json::to_value(&p).unwrap();
assert_eq!(
v,
json!({
"component": "Home",
"props": {"msg": "hi"},
"url": "/",
"version": "v1"
})
);
}
#[test]
fn flags_and_lists_serialize_when_non_default() {
let mut p = PageObject::new("Home", json!({}), "/", "v1");
p.encrypt_history = true;
p.merge_props = vec!["notifications".into()];
p.deferred_props
.insert("dashboard".into(), vec!["stats".into()]);
let v = serde_json::to_value(&p).unwrap();
assert_eq!(v["encryptHistory"], true);
assert_eq!(v["mergeProps"], json!(["notifications"]));
assert_eq!(v["deferredProps"], json!({"dashboard": ["stats"]}));
}
}