telegraph_api_rs/types/
node.rs

1use serde::{Deserialize, Serialize};
2
3use super::{NodeElement, TelegraphType};
4
5
6#[allow(missing_docs)]
7/// This abstract object represents a DOM Node. 
8/// It can be a String which represents a DOM text node or a [`NodeElement`].
9#[derive(Deserialize, Serialize, Debug)]
10#[serde(untagged)]
11pub enum Node {
12    String(String),
13    NodeElement(NodeElement)
14}
15
16
17impl TelegraphType for Node {}
18
19
20#[cfg(test)]
21mod tests {
22    use serde_json;
23
24    use crate::types::{NodeElement, NodeTag};
25
26    use super::Node;
27
28    #[test]
29    fn node_text_deserialize() {
30        let json = "[\"It's text node\"]";
31        let nodes: Vec<Node> = serde_json::from_str(json).unwrap_or_default();
32        let el = if let Some(Node::String(el)) = nodes.into_iter().nth(0) {
33            el
34        } else {
35            String::new()
36        };
37        assert_eq!(el, "It's text node")
38    }
39
40    #[test]
41    fn node_element_deserialize() {
42        let json = r#"
43        {
44            "tag": "p"
45        }"#;
46        let node: Node = serde_json::from_str(json).unwrap();
47        let el = if let Node::NodeElement(el) = node {
48            el
49        } else {
50            NodeElement::default()
51        };
52        assert_eq!(el.tag.map( |node_tag|
53            match node_tag {
54                NodeTag::P => "p".to_string(),
55                _ => "".to_string()
56            }
57        ).unwrap(), "p");
58    }
59}