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