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}
44
45impl Node {
46 pub fn new(
60 id: &str, r#type: String,
62 attrs: Attrs,
63 content: Vec<NodeId>,
64 marks: Vec<Mark>,
65 ) -> Self {
66 Node {
67 id: id.into(), r#type,
69 attrs,
70 content: content.into(),
71 marks: marks.into(),
72 }
73 }
74 pub fn child_count(&self) -> usize {
80 self.content.len()
81 }
82 pub fn update_attr(
90 &self,
91 new_values: imbl::HashMap<String, Value>,
92 ) -> Self {
93 let mut new_node = self.clone();
94 let new_attrs = self.attrs.update(new_values);
95 new_node.attrs = new_attrs;
96 new_node
97 }
98 pub fn insert_content_at_index(
106 &self,
107 index: usize,
108 node_id: &str,
109 ) -> Self {
110 let mut new_node = self.clone();
111 new_node.content.insert(index, node_id.into());
112 new_node
113 }
114 pub fn insert_contents(
121 &self,
122 node_ids: &Vec<NodeId>,
123 ) -> Self {
124 let mut new_node = self.clone();
125 for node_id in node_ids {
126 new_node.content.push_back(node_id.clone());
127 }
128 new_node
129 }
130 pub fn insert_content(
137 &self,
138 node_id: &str,
139 ) -> Self {
140 let mut new_node = self.clone();
141 new_node.content.push_back(node_id.into());
142 new_node
143 }
144
145 pub fn remove_mark_by_name(
152 &self,
153 mark_name: &str,
154 ) -> Self {
155 let mut new_node = self.clone();
156 new_node.marks = new_node
157 .marks
158 .iter()
159 .filter(|&m| m.r#type != mark_name)
160 .cloned()
161 .collect();
162 new_node
163 }
164 pub fn remove_mark(
171 &self,
172 mark_types: &[String],
173 ) -> Self {
174 let mut new_node = self.clone();
175 new_node.marks = new_node
176 .marks
177 .iter()
178 .filter(|&m| !mark_types.contains(&m.r#type))
179 .cloned()
180 .collect();
181 new_node
182 }
183 pub fn add_marks(
190 &self,
191 marks: &Vec<Mark>,
192 ) -> Self {
193 let mark_types =
194 marks.iter().map(|m| m.r#type.clone()).collect::<Vec<String>>();
195 let mut new_node = self.clone();
196 new_node.marks = new_node
198 .marks
199 .iter()
200 .filter(|m| !mark_types.contains(&m.r#type))
201 .cloned()
202 .collect();
203 new_node.marks.extend(marks.iter().map(|m| m.clone()));
204 new_node
205 }
206}