moduforge_runtime/
async_runtime.rs1use 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
22pub struct Editor {
25 base: EditorBase,
26 flow_engine: FlowEngine,
27}
28
29impl Editor {
30 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 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}