moduforge_runtime/
async_runtime.rs

1use std::sync::Arc;
2
3use crate::{
4    event::{Event, EventBus},
5    extension_manager::ExtensionManager,
6    flow::{FlowEngine, ProcessorResult},
7    helpers::create_doc,
8    history_manager::HistoryManager,
9    traits::{EditorBase, EditorCore},
10    types::EditorOptions,
11};
12use async_trait::async_trait;
13use moduforge_core::{
14    model::{node_pool::NodePool, schema::Schema},
15    state::{
16        state::{State, StateConfig},
17        transaction::{Command, Transaction},
18    },
19    transform::transform::Transform,
20};
21
22/// Editor 结构体代表编辑器的核心功能实现
23/// 负责管理文档状态、事件处理、插件系统和存储等核心功能
24pub struct Editor {
25    base: EditorBase,
26    flow_engine: FlowEngine,
27}
28
29impl Editor {
30    /// 创建新的编辑器实例
31    /// options: 编辑器配置选项
32    pub async fn create(options: EditorOptions) -> Result<Self, Box<dyn std::error::Error>> {
33        let extension_manager = ExtensionManager::new(&options.get_extensions());
34
35        let doc = create_doc::create_doc(&options.get_content());
36        let event_bus = EventBus::new();
37        let state: State = State::create(StateConfig {
38            schema: Some(extension_manager.get_schema()),
39            doc,
40            stored_marks: None,
41            plugins: Some(extension_manager.get_plugins().clone()),
42        })
43        .await?;
44        let state: Arc<State> = Arc::new(state);
45
46        let base = EditorBase {
47            event_bus,
48            state: state.clone(),
49            extension_manager,
50            history_manager: HistoryManager::new(state, options.get_history_limit()),
51            options,
52        };
53
54        let mut runtime = Editor { base, flow_engine: FlowEngine::new()? };
55        runtime.init().await?;
56        Ok(runtime)
57    }
58
59    /// 初始化编辑器,设置事件处理器并启动事件循环
60    async fn init(&mut self) -> Result<(), Box<dyn std::error::Error>> {
61        self.base.event_bus.add_event_handlers(self.base.options.get_event_handlers()).await?;
62        self.base.event_bus.start_event_loop();
63        self.base.event_bus.broadcast_blocking(Event::Create(self.base.state.clone()))?;
64        Ok(())
65    }
66}
67#[async_trait]
68impl EditorCore for Editor {
69    type Error = Box<dyn std::error::Error>;
70
71    fn doc(&self) -> Arc<NodePool> {
72        self.base.doc()
73    }
74
75    fn get_options(&self) -> &EditorOptions {
76        self.base.get_options()
77    }
78
79    fn get_state(&self) -> &Arc<State> {
80        self.base.get_state()
81    }
82
83    fn get_schema(&self) -> Arc<Schema> {
84        self.base.get_schema()
85    }
86
87    fn get_event_bus(&self) -> &EventBus {
88        self.base.get_event_bus()
89    }
90
91    fn get_tr(&self) -> Transaction {
92        self.base.get_tr()
93    }
94
95    async fn command(
96        &mut self,
97        command: Arc<dyn Command>,
98    ) -> Result<(), Self::Error> {
99        let mut tr = self.get_tr();
100        tr.transaction(command).await;
101        self.dispatch(tr).await
102    }
103
104    async fn dispatch(
105        &mut self,
106        transaction: Transaction,
107    ) -> Result<(), Self::Error> {
108        let (_id, mut rx) = self.flow_engine.submit_transaction((self.base.state.clone(), transaction)).await?;
109        match rx.recv().await {
110            Some(task_result) => {
111                if let Some(ProcessorResult { result, status: _, error: _ }) = task_result.output {
112                    if let Some(result) = result {
113                        self.base.state = Arc::new(result.state);
114                        let mut trs = result.trs;
115                        let tr = trs.pop().unwrap();
116                        if !tr.doc_changed() {
117                            return Ok(());
118                        }
119                        self.base.history_manager.insert(self.base.state.clone());
120                        let event_bus = self.get_event_bus();
121                        event_bus.broadcast(Event::TrApply(Arc::new(tr), self.base.state.clone())).await?;
122                    }
123                }
124            },
125            None => {
126                println!("transaction is not found");
127            },
128        }
129        Ok(())
130    }
131
132    async fn register_plugin(&mut self) -> Result<(), Self::Error> {
133        let state = self
134            .get_state()
135            .reconfigure(StateConfig {
136                schema: Some(self.get_schema()),
137                doc: Some(self.get_state().doc()),
138                stored_marks: None,
139                plugins: Some(self.get_state().plugins().clone()),
140            })
141            .await?;
142        self.base.state = Arc::new(state);
143        Ok(())
144    }
145
146    async fn unregister_plugin(
147        &mut self,
148        plugin_key: String,
149    ) -> Result<(), Self::Error> {
150        let ps = self.get_state().plugins().iter().filter(|p| p.key != plugin_key).cloned().collect();
151        let state = self
152            .get_state()
153            .reconfigure(StateConfig {
154                schema: Some(self.get_schema().clone()),
155                doc: Some(self.get_state().doc()),
156                stored_marks: None,
157                plugins: Some(ps),
158            })
159            .await?;
160        self.base.state = Arc::new(state);
161        Ok(())
162    }
163
164    fn undo(&mut self) {
165        self.base.undo()
166    }
167
168    fn redo(&mut self) {
169        self.base.redo()
170    }
171}