1use super::attrs::Attrs;
2use super::mark::Mark;
3use super::types::NodeId;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
32pub struct Node {
33 #[serde(rename = "i")]
34 pub id: NodeId,
35 #[serde(rename = "t")]
36 pub r#type: String,
37 #[serde(rename = "a")]
38 pub attrs: Attrs,
39 #[serde(rename = "c")]
40 pub content: im::Vector<NodeId>, #[serde(rename = "m")]
42 pub marks: im::Vector<Mark>,
43}
44unsafe impl Send for Node {}
45unsafe impl Sync for Node {}
46
47impl Node {
48 pub fn new(
62 id: &str, r#type: String,
64 attrs: Attrs,
65 content: Vec<NodeId>,
66 marks: Vec<Mark>,
67 ) -> Self {
68 Node {
69 id: id.into(), r#type,
71 attrs,
72 content: content.into(),
73 marks: marks.into(),
74 }
75 }
76 pub fn child_count(&self) -> usize {
82 self.content.len()
83 }
84 pub fn update_attr(&self, new_values: im::HashMap<String, Value>) -> Self {
92 let mut new_node = self.clone();
93 let new_attrs = self.attrs.update(new_values);
94 new_node.attrs = new_attrs;
95 new_node
96 }
97 pub fn insert_content_at_index(&self, index: usize, node_id: &str) -> Self {
98 let mut new_node = self.clone();
99 new_node.content.insert(index, node_id.into());
100 new_node
101 }
102 pub fn insert_contents(&self, node_ids: &Vec<String>) -> Self {
103 let mut new_node = self.clone();
104 for node_id in node_ids {
105 new_node.content.push_back(node_id.into());
106 }
107 new_node
108 }
109 pub fn insert_content(&self, node_id: &str) -> Self {
110 let mut new_node = self.clone();
111 new_node.content.push_back(node_id.into());
112 new_node
113 }
114
115 pub fn remove_mark_by_name(&self, mark_name: &str) -> Self {
116 let mut new_node = self.clone();
117 new_node.marks = new_node
118 .marks
119 .iter()
120 .filter(|&m| m.r#type != mark_name)
121 .cloned()
122 .collect();
123 new_node
124 }
125 pub fn remove_mark(&self, mark_types: &[String]) -> Self {
126 let mut new_node = self.clone();
127 new_node.marks = new_node
128 .marks
129 .iter()
130 .filter(|&m| !mark_types.contains(&m.r#type))
131 .cloned()
132 .collect();
133 new_node
134 }
135 pub fn add_marks(&self, marks: &Vec<Mark>) -> Self {
136 let mark_types =
137 marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
138 let mut new_node = self.clone();
139 new_node.marks = new_node
141 .marks
142 .iter()
143 .filter(|m| !mark_types.contains(&m.r#type))
144 .cloned()
145 .collect();
146 new_node.marks.extend(marks.iter().map(|m| m.clone()));
147 new_node
148 }
149}