moduforge_core/
runtime.rs1use std::sync::Arc;
2
3use crate::{
4 error::{EditorError, EditorResult, error_utils},
5 event::{Event, EventBus},
6 extension_manager::ExtensionManager,
7 helpers::create_doc,
8 history_manager::HistoryManager,
9 types::EditorOptions,
10 traits::{EditorCore, EditorBase},
11};
12use async_trait::async_trait;
13
14use moduforge_model::{node_pool::NodePool, schema::Schema};
15use moduforge_state::{
16 state::{State, StateConfig, TransactionResult},
17 transaction::{Command, Transaction},
18 {info, debug, error},
19};
20
21pub struct Editor {
24 base: EditorBase,
25}
26
27impl Editor {
28 pub async fn create(options: EditorOptions) -> EditorResult<Self> {
31 info!("正在创建新的编辑器实例");
32 let extension_manager =
33 ExtensionManager::new(&options.get_extensions());
34 debug!("已初始化扩展管理器");
35
36 let doc = create_doc::create_doc(
37 &extension_manager.get_schema(),
38 &options.get_content(),
39 )
40 .await;
41 let event_bus = EventBus::new();
42 debug!("已创建文档和事件总线");
43
44 let state: State = State::create(StateConfig {
45 schema: Some(extension_manager.get_schema()),
46 doc,
47 stored_marks: None,
48 plugins: Some(extension_manager.get_plugins().clone()),
49 })
50 .await
51 .map_err(|e| {
52 error!("创建状态失败: {}", e);
53 error_utils::state_error(format!("Failed to create state: {}", e))
54 })?;
55
56 let state: Arc<State> = Arc::new(state);
57 debug!("已创建编辑器状态");
58
59 let base = EditorBase {
60 event_bus,
61 state: state.clone(),
62 extension_manager,
63 history_manager: HistoryManager::new(
64 state,
65 options.get_history_limit(),
66 ),
67 options,
68 };
69
70 let mut runtime = Editor { base };
71 runtime.init().await?;
72 info!("编辑器实例创建成功");
73 Ok(runtime)
74 }
75
76 async fn init(&mut self) -> EditorResult<()> {
78 debug!("正在初始化编辑器");
79 self.base
80 .event_bus
81 .add_event_handlers(self.base.options.get_event_handlers())
82 .await?;
83 self.base.event_bus.start_event_loop();
84 debug!("事件总线已启动");
85
86 self.base
87 .event_bus
88 .broadcast_blocking(Event::Create(self.base.state.clone()))
89 .map_err(|e| {
90 error!("广播创建事件失败: {}", e);
91 error_utils::event_error(format!(
92 "Failed to broadcast create event: {}",
93 e
94 ))
95 })?;
96 debug!("已广播创建事件");
97 Ok(())
98 }
99
100 pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
102 debug!("正在销毁编辑器实例");
103 self.base.event_bus.broadcast(Event::Destroy).await?;
105 self.base.event_bus.broadcast(Event::Stop).await?;
107 debug!("编辑器实例销毁成功");
108 Ok(())
109 }
110}
111
112#[async_trait]
113impl EditorCore for Editor {
114 type Error = EditorError;
115
116 fn doc(&self) -> Arc<NodePool> {
117 self.base.doc()
118 }
119
120 fn get_options(&self) -> &EditorOptions {
121 self.base.get_options()
122 }
123
124 fn get_state(&self) -> &Arc<State> {
125 self.base.get_state()
126 }
127
128 fn get_schema(&self) -> Arc<Schema> {
129 self.base.get_schema()
130 }
131
132 fn get_event_bus(&self) -> &EventBus {
133 self.base.get_event_bus()
134 }
135
136 fn get_tr(&self) -> Transaction {
137 self.base.get_tr()
138 }
139
140 async fn command(
141 &mut self,
142 command: Arc<dyn Command>,
143 ) -> EditorResult<()> {
144 debug!("正在执行命令: {}", command.name());
145 let mut tr = self.get_tr();
146 tr.transaction(command).await;
147 self.dispatch(tr).await
148 }
149
150 async fn dispatch(
151 &mut self,
152 transaction: Transaction,
153 ) -> EditorResult<()> {
154 let TransactionResult { state, transactions } =
155 self.base.state.apply(transaction).await.map_err(|e| {
156 error_utils::state_error(format!(
157 "Failed to apply transaction: {}",
158 e
159 ))
160 })?;
161
162 if let Some(tr) = transactions.last() {
163 if tr.doc_changed() {
164 self.base.state = Arc::new(state);
165 self.base.history_manager.insert(self.base.state.clone());
166
167 self.base
168 .event_bus
169 .broadcast(Event::TrApply(
170 Arc::new(transactions),
171 self.base.state.clone(),
172 ))
173 .await
174 .map_err(|e| {
175 error_utils::event_error(format!(
176 "Failed to broadcast transaction event: {}",
177 e
178 ))
179 })?;
180 }
181 }
182
183 Ok(())
184 }
185
186 async fn register_plugin(&mut self) -> EditorResult<()> {
187 info!("正在注册新插件");
188 let state = self
189 .get_state()
190 .reconfigure(StateConfig {
191 schema: Some(self.get_schema()),
192 doc: Some(self.get_state().doc()),
193 stored_marks: None,
194 plugins: Some(self.get_state().plugins().clone()),
195 })
196 .await
197 .map_err(|e| {
198 error!("重新配置状态失败: {}", e);
199 error_utils::state_error(format!(
200 "Failed to reconfigure state: {}",
201 e
202 ))
203 })?;
204 self.base.state = Arc::new(state);
205 info!("插件注册成功");
206 Ok(())
207 }
208
209 async fn unregister_plugin(
210 &mut self,
211 plugin_key: String,
212 ) -> EditorResult<()> {
213 info!("正在注销插件: {}", plugin_key);
214 let ps = self
215 .get_state()
216 .plugins()
217 .iter()
218 .filter(|p| p.key != plugin_key)
219 .cloned()
220 .collect();
221 let state = self
222 .get_state()
223 .reconfigure(StateConfig {
224 schema: Some(self.get_schema().clone()),
225 doc: Some(self.get_state().doc()),
226 stored_marks: None,
227 plugins: Some(ps),
228 })
229 .await
230 .map_err(|e| {
231 error!("重新配置状态失败: {}", e);
232 error_utils::state_error(format!(
233 "Failed to reconfigure state: {}",
234 e
235 ))
236 })?;
237 self.base.state = Arc::new(state);
238 info!("插件注销成功");
239 Ok(())
240 }
241
242 fn undo(&mut self) {
243 debug!("执行撤销操作");
244 self.base.undo()
245 }
246
247 fn redo(&mut self) {
248 debug!("执行重做操作");
249 self.base.redo()
250 }
251}