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