mrml/mj_accordion/
mod.rs

1//! Module containing the `mj-accordion` element as defined in [the documentation](https://documentation.mjml.io/#mj-accordion).
2//!
3//! ```rust
4//! let template = include_str!("../../resources/compare/success/mj-accordion.mjml");
5//! let root = mrml::parse(template).expect("parse template");
6//! let opts = mrml::prelude::render::RenderOptions::default();
7//! match root.element.render(&opts) {
8//!     Ok(content) => println!("{content}"),
9//!     Err(_) => println!("couldn't render mjml template"),
10//! };
11//! ```
12
13mod children;
14#[cfg(feature = "json")]
15mod json;
16#[cfg(feature = "parse")]
17mod parse;
18#[cfg(feature = "print")]
19mod print;
20#[cfg(feature = "render")]
21mod render;
22
23use std::marker::PhantomData;
24
25pub use children::MjAccordionChild;
26
27use crate::prelude::{Component, StaticTag};
28
29pub const NAME: &str = "mj-accordion";
30
31pub struct MjAccordionTag;
32
33impl StaticTag for MjAccordionTag {
34    fn static_tag() -> &'static str {
35        NAME
36    }
37}
38
39pub type MjAccordion =
40    Component<PhantomData<MjAccordionTag>, crate::prelude::AttributeMap, Vec<MjAccordionChild>>;
41
42#[cfg(all(test, feature = "parse", feature = "render"))]
43mod tests {
44    #[cfg(feature = "print")]
45    #[test]
46    fn chaining_print_parse() {
47        use crate::mj_accordion::MjAccordion;
48        use crate::mj_accordion_element::{MjAccordionElement, MjAccordionElementChildren};
49        use crate::mj_accordion_title::MjAccordionTitle;
50        use crate::prelude::parser::{MrmlCursor, MrmlParser, ParserOptions};
51        use crate::prelude::print::Printable;
52        use crate::text::Text;
53
54        let element = MjAccordion::new(
55            Default::default(),
56            vec![MjAccordionElement::new(
57                Default::default(),
58                MjAccordionElementChildren {
59                    title: Some(MjAccordionTitle::new(
60                        Default::default(),
61                        vec![Text::from("Hello World!".to_string())],
62                    )),
63                    text: None,
64                },
65            )
66            .into()],
67        );
68        let initial = element.print_dense().unwrap();
69        let raw ="<mj-accordion><mj-accordion-element><mj-accordion-title>Hello World!</mj-accordion-title></mj-accordion-element></mj-accordion>";
70        let opts = ParserOptions::default();
71        let parser = MrmlParser::new(&opts);
72        let mut cursor = MrmlCursor::new(raw);
73        let elt: MjAccordion = parser.parse_root(&mut cursor).unwrap();
74        let result = elt.print_dense().unwrap();
75        assert_eq!(initial, result);
76    }
77
78    #[cfg(feature = "json")]
79    #[test]
80    fn chaining_json_parse() {
81        use crate::mj_accordion::{MjAccordion, MjAccordionChild};
82        use crate::mj_accordion_element::{MjAccordionElement, MjAccordionElementChildren};
83        use crate::mj_accordion_title::MjAccordionTitle;
84        use crate::text::Text;
85
86        let element = MjAccordion::new(
87            Default::default(),
88            vec![MjAccordionChild::MjAccordionElement(
89                MjAccordionElement::new(
90                    Default::default(),
91                    MjAccordionElementChildren {
92                        title: Some(MjAccordionTitle::new(
93                            Default::default(),
94                            vec![Text::from("Hello World!".to_string())],
95                        )),
96                        text: None,
97                    },
98                ),
99            )],
100        );
101        let initial_json = serde_json::to_string(&element).unwrap();
102        let result: MjAccordion = serde_json::from_str(initial_json.as_str()).unwrap();
103
104        let result_json = serde_json::to_string(&result).unwrap();
105        assert_eq!(initial_json, result_json);
106    }
107}