use super::prelude::*;
#[derive(Debug)]
pub struct JsonRender {
pub pretty: bool,
}
impl JsonRender {
#[inline]
pub fn pretty() -> Self {
JsonRender { pretty: true }
}
#[inline]
pub fn compact() -> Self {
JsonRender { pretty: false }
}
}
impl Render for JsonRender {
type Output = String;
fn render(&self, tree: &SyntaxTree) -> String {
let writer = if self.pretty {
serde_json::to_string_pretty
} else {
serde_json::to_string
};
writer(tree).expect("Unable to serialize JSON")
}
}
#[test]
fn json() {
const PRETTY_OUTPUT: &str = r#"{
"elements": [
{
"element": "text",
"data": "apple"
},
{
"element": "text",
"data": " "
},
{
"element": "container",
"data": {
"type": "strong",
"elements": [
{
"element": "text",
"data": "banana"
}
]
}
}
],
"styles": [
"span.hidden-text { display: none; }"
]
}"#;
const COMPACT_OUTPUT: &str = "{\"elements\":[{\"element\":\"text\",\"data\":\"apple\"},{\"element\":\"text\",\"data\":\" \"},{\"element\":\"container\",\"data\":{\"type\":\"strong\",\"elements\":[{\"element\":\"text\",\"data\":\"banana\"}]}}],\"styles\":[\"span.hidden-text { display: none; }\"]}";
let elements = vec![
text!("apple"),
text!(" "),
Element::Container(Container::new(ContainerType::Strong, vec![text!("banana")])),
];
let warnings = vec![];
let styles = vec![cow!("span.hidden-text { display: none; }")];
let result = SyntaxTree::from_element_result(elements, warnings, styles);
let (tree, _) = result.into();
let output = JsonRender::pretty().render(&tree);
assert_eq!(
output, PRETTY_OUTPUT,
"Pretty JSON syntax tree output doesn't match",
);
let output = JsonRender::compact().render(&tree);
assert_eq!(
output, COMPACT_OUTPUT,
"Compact JSON syntax tree output doesn't match",
);
}