moduforge_runtime/
runtime.rs

1use 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
22/// Editor 结构体代表编辑器的核心功能实现
23/// 负责管理文档状态、事件处理、插件系统和存储等核心功能
24pub struct Editor {
25    base: EditorBase,
26}
27
28impl Editor {
29    /// 创建新的编辑器实例
30    /// options: 编辑器配置选项
31    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    /// 初始化编辑器,设置事件处理器并启动事件循环
78    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    /// 销毁编辑器实例
102    pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
103        debug!("正在销毁编辑器实例");
104        // 广播销毁事件
105        self.base.event_bus.broadcast(Event::Destroy).await?;
106        // 停止事件循环
107        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}