1use std::sync::Arc;
2
3use crate::{
4 error::{EditorResult, error_utils},
5 event::{Event, EventBus},
6 extension_manager::ExtensionManager,
7 helpers::create_doc,
8 history_manager::HistoryManager,
9 types::EditorOptions,
10 middleware::{Middleware, MiddlewareStack},
11};
12
13use moduforge_model::{node_pool::NodePool, schema::Schema};
14use moduforge_state::{
15 state::{State, StateConfig, TransactionResult},
16 transaction::{Command, Transaction},
17 {info, debug, error},
18};
19
20pub struct Editor {
23 pub event_bus: EventBus,
24 pub state: Arc<State>,
25 pub extension_manager: ExtensionManager,
26 pub history_manager: HistoryManager<Arc<State>>,
27 pub options: EditorOptions,
28 pub middleware_stack: MiddlewareStack,
29}
30
31impl Editor {
32 pub async fn create(options: EditorOptions) -> EditorResult<Self> {
35 info!("正在创建新的编辑器实例");
36 let extension_manager =
37 ExtensionManager::new(&options.get_extensions());
38 debug!("已初始化扩展管理器");
39
40 let doc = create_doc::create_doc(
41 &extension_manager.get_schema(),
42 &options.get_content(),
43 )
44 .await;
45 let event_bus = EventBus::new();
46 debug!("已创建文档和事件总线");
47
48 let state: State = State::create(StateConfig {
49 schema: Some(extension_manager.get_schema()),
50 doc,
51 stored_marks: None,
52 plugins: Some(extension_manager.get_plugins().clone()),
53 })
54 .await
55 .map_err(|e| {
56 error!("创建状态失败: {}", e);
57 error_utils::state_error(format!("Failed to create state: {}", e))
58 })?;
59
60 let state: Arc<State> = Arc::new(state);
61 debug!("已创建编辑器状态");
62
63 let mut runtime = Editor {
64 event_bus,
65 state: state.clone(),
66 extension_manager,
67 history_manager: HistoryManager::new(
68 state,
69 options.get_history_limit(),
70 ),
71 options,
72 middleware_stack: MiddlewareStack::new(),
73 };
74 runtime.init().await?;
75 info!("编辑器实例创建成功");
76 Ok(runtime)
77 }
78
79 async fn init(&mut self) -> EditorResult<()> {
81 debug!("正在初始化编辑器");
82 self.event_bus
83 .add_event_handlers(self.options.get_event_handlers())
84 .await?;
85 self.event_bus.start_event_loop();
86 debug!("事件总线已启动");
87
88 self.event_bus
89 .broadcast_blocking(Event::Create(self.state.clone()))
90 .map_err(|e| {
91 error!("广播创建事件失败: {}", e);
92 error_utils::event_error(format!(
93 "Failed to broadcast create event: {}",
94 e
95 ))
96 })?;
97 debug!("已广播创建事件");
98 Ok(())
99 }
100
101 pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
103 debug!("正在销毁编辑器实例");
104 self.event_bus.broadcast(Event::Destroy).await?;
106 self.event_bus.broadcast(Event::Stop).await?;
108 debug!("编辑器实例销毁成功");
109 Ok(())
110 }
111
112 pub fn add_middleware<M>(
114 &mut self,
115 middleware: M,
116 ) where
117 M: Middleware + 'static,
118 {
119 self.middleware_stack.add(middleware);
120 }
121 pub async fn run_before_middleware(
122 &mut self,
123 transaction: &mut Transaction,
124 ) -> EditorResult<()> {
125 debug!("执行前置中间件链");
126 for middleware in &self.middleware_stack.middlewares {
127 let timeout = std::time::Duration::from_millis(500);
128 if let Err(e) = tokio::time::timeout(
129 timeout,
130 middleware.before_dispatch(transaction),
131 )
132 .await
133 {
134 return Err(error_utils::middleware_error(format!(
135 "中间件执行超时: {}",
136 e
137 )));
138 }
139 }
140 Ok(())
141 }
142 pub async fn run_after_middleware(
143 &mut self,
144 state: &mut Option<Arc<State>>,
145 ) -> EditorResult<()> {
146 debug!("执行后置中间件链");
147 for middleware in &self.middleware_stack.middlewares {
148 let timeout = std::time::Duration::from_millis(500);
149 let middleware_result = match tokio::time::timeout(
150 timeout,
151 middleware.after_dispatch(state.clone()),
152 )
153 .await
154 {
155 Ok(result) => result?,
156 Err(e) => {
157 return Err(error_utils::middleware_error(format!(
158 "中间件执行超时: {}",
159 e
160 )));
161 },
162 };
163
164 if let Some(transaction) = middleware_result.additional_transaction
165 {
166 let TransactionResult { state: new_state, transactions: _ } =
167 self.state.apply(transaction).await.map_err(|e| {
168 error_utils::state_error(format!(
169 "附加事务应用失败: {}",
170 e
171 ))
172 })?;
173 *state = Some(Arc::new(new_state));
174 }
175 }
176 Ok(())
177 }
178 pub async fn command(
179 &mut self,
180 command: Arc<dyn Command>,
181 ) -> EditorResult<()> {
182 debug!("正在执行命令: {}", command.name());
183 let mut tr = self.get_tr();
184 tr.transaction(command).await;
185 self.dispatch(tr).await
186 }
187
188 pub async fn dispatch(
196 &mut self,
197 transaction: Transaction,
198 ) -> EditorResult<()> {
199 let mut current_transaction = transaction;
201 self.run_before_middleware(&mut current_transaction).await?;
202
203 let TransactionResult { state, transactions } =
205 self.state.apply(current_transaction).await.map_err(|e| {
206 error_utils::state_error(format!(
207 "Failed to apply transaction: {}",
208 e
209 ))
210 })?;
211
212 let mut state_update = None;
214
215 if let Some(tr) = transactions.last() {
217 if tr.doc_changed() {
218 state_update = Some(Arc::new(state));
220
221 let transactions = Arc::new(transactions);
223
224 self.event_bus
225 .broadcast(Event::TrApply(transactions, state_update.clone().unwrap()))
226 .await
227 .map_err(|e| {
228 error_utils::event_error(format!(
229 "Failed to broadcast event: {}",
230 e
231 ))
232 })?;
233 }
234 }
235 self.run_after_middleware(&mut state_update).await?;
237
238 if let Some(state) = state_update {
240 self.state = state;
241 self.history_manager.insert(self.state.clone());
243 }
244
245 Ok(())
246 }
247
248 pub async fn register_plugin(&mut self) -> EditorResult<()> {
249 info!("正在注册新插件");
250 let state = self
251 .get_state()
252 .reconfigure(StateConfig {
253 schema: Some(self.get_schema()),
254 doc: Some(self.get_state().doc()),
255 stored_marks: None,
256 plugins: Some(self.get_state().plugins().clone()),
257 })
258 .await
259 .map_err(|e| {
260 error!("重新配置状态失败: {}", e);
261 error_utils::state_error(format!(
262 "Failed to reconfigure state: {}",
263 e
264 ))
265 })?;
266 self.state = Arc::new(state);
267 info!("插件注册成功");
268 Ok(())
269 }
270
271 pub async fn unregister_plugin(
272 &mut self,
273 plugin_key: String,
274 ) -> EditorResult<()> {
275 info!("正在注销插件: {}", plugin_key);
276 let ps = self
277 .get_state()
278 .plugins()
279 .iter()
280 .filter(|p| p.key != plugin_key)
281 .cloned()
282 .collect();
283 let state = self
284 .get_state()
285 .reconfigure(StateConfig {
286 schema: Some(self.get_schema().clone()),
287 doc: Some(self.get_state().doc()),
288 stored_marks: None,
289 plugins: Some(ps),
290 })
291 .await
292 .map_err(|e| {
293 error!("重新配置状态失败: {}", e);
294 error_utils::state_error(format!(
295 "Failed to reconfigure state: {}",
296 e
297 ))
298 })?;
299 self.state = Arc::new(state);
300 info!("插件注销成功");
301 Ok(())
302 }
303
304 pub fn doc(&self) -> Arc<NodePool> {
306 self.state.doc()
307 }
308
309 pub fn get_options(&self) -> &EditorOptions {
310 &self.options
311 }
312
313 pub fn get_state(&self) -> &Arc<State> {
314 &self.state
315 }
316
317 pub fn get_schema(&self) -> Arc<Schema> {
318 self.extension_manager.get_schema()
319 }
320
321 pub fn get_event_bus(&self) -> &EventBus {
322 &self.event_bus
323 }
324
325 pub fn get_tr(&self) -> Transaction {
326 let tr = self.get_state().tr();
327 tr
328 }
329
330 pub fn undo(&mut self) {
331 self.history_manager.jump(-1);
332 self.state = self.history_manager.get_present();
333 }
334
335
336 pub fn redo(&mut self) {
337 self.history_manager.jump(1);
338 self.state = self.history_manager.get_present();
339 }
340
341 pub fn jump(&mut self, n: isize) {
342 self.history_manager.jump(n);
343 self.state = self.history_manager.get_present();
344 }
345
346}