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: imbl::Vector<NodeId>, #[serde(rename = "m")]
42 pub marks: imbl::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: imbl::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 {
105 let mut new_node = self.clone();
106 new_node.content.insert(index, node_id.into());
107 new_node
108 }
109 pub fn insert_contents(&self, node_ids: &Vec<String>) -> Self {
116 let mut new_node = self.clone();
117 for node_id in node_ids {
118 new_node.content.push_back(node_id.into());
119 }
120 new_node
121 }
122 pub fn insert_content(&self, node_id: &str) -> Self {
129 let mut new_node = self.clone();
130 new_node.content.push_back(node_id.into());
131 new_node
132 }
133
134 pub fn remove_mark_by_name(&self, mark_name: &str) -> Self {
141 let mut new_node = self.clone();
142 new_node.marks = new_node
143 .marks
144 .iter()
145 .filter(|&m| m.r#type != mark_name)
146 .cloned()
147 .collect();
148 new_node
149 }
150 pub fn remove_mark(&self, mark_types: &[String]) -> Self {
157 let mut new_node = self.clone();
158 new_node.marks = new_node
159 .marks
160 .iter()
161 .filter(|&m| !mark_types.contains(&m.r#type))
162 .cloned()
163 .collect();
164 new_node
165 }
166 pub fn add_marks(&self, marks: &Vec<Mark>) -> Self {
173 let mark_types =
174 marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
175 let mut new_node = self.clone();
176 new_node.marks = new_node
178 .marks
179 .iter()
180 .filter(|m| !mark_types.contains(&m.r#type))
181 .cloned()
182 .collect();
183 new_node.marks.extend(marks.iter().map(|m| m.clone()));
184 new_node
185 }
186}