use std::sync::Arc;
use crate::{
error::{EditorError, EditorResult, error_utils},
event::{Event, EventBus},
extension_manager::ExtensionManager,
helpers::create_doc,
history_manager::HistoryManager,
types::EditorOptions,
traits::{EditorCore, EditorBase},
};
use async_trait::async_trait;
use moduforge_model::{node_pool::NodePool, schema::Schema};
use moduforge_state::{
state::{State, StateConfig, TransactionResult},
transaction::{Command, Transaction},
{info, debug, error},
};
use moduforge_transform::transform::Transform;
pub struct Editor {
base: EditorBase,
}
impl Editor {
pub async fn create(options: EditorOptions) -> EditorResult<Self> {
info!("正在创建新的编辑器实例");
let extension_manager =
ExtensionManager::new(&options.get_extensions());
debug!("已初始化扩展管理器");
let doc = create_doc::create_doc(
&extension_manager.get_schema(),
&options.get_content(),
)
.await;
let event_bus = EventBus::new();
debug!("已创建文档和事件总线");
let state: State = State::create(StateConfig {
schema: Some(extension_manager.get_schema()),
doc,
stored_marks: None,
plugins: Some(extension_manager.get_plugins().clone()),
})
.await
.map_err(|e| {
error!("创建状态失败: {}", e);
error_utils::state_error(format!("Failed to create state: {}", e))
})?;
let state: Arc<State> = Arc::new(state);
debug!("已创建编辑器状态");
let base = EditorBase {
event_bus,
state: state.clone(),
extension_manager,
history_manager: HistoryManager::new(
state,
options.get_history_limit(),
),
options,
};
let mut runtime = Editor { base };
runtime.init().await?;
info!("编辑器实例创建成功");
Ok(runtime)
}
async fn init(&mut self) -> EditorResult<()> {
debug!("正在初始化编辑器");
self.base
.event_bus
.add_event_handlers(self.base.options.get_event_handlers())
.await?;
self.base.event_bus.start_event_loop();
debug!("事件总线已启动");
self.base
.event_bus
.broadcast_blocking(Event::Create(self.base.state.clone()))
.map_err(|e| {
error!("广播创建事件失败: {}", e);
error_utils::event_error(format!(
"Failed to broadcast create event: {}",
e
))
})?;
debug!("已广播创建事件");
Ok(())
}
pub async fn destroy(&mut self) -> Result<(), Box<dyn std::error::Error>> {
debug!("正在销毁编辑器实例");
self.base.event_bus.broadcast(Event::Destroy).await?;
self.base.event_bus.broadcast(Event::Stop).await?;
debug!("编辑器实例销毁成功");
Ok(())
}
}
#[async_trait]
impl EditorCore for Editor {
type Error = EditorError;
fn doc(&self) -> Arc<NodePool> {
self.base.doc()
}
fn get_options(&self) -> &EditorOptions {
self.base.get_options()
}
fn get_state(&self) -> &Arc<State> {
self.base.get_state()
}
fn get_schema(&self) -> Arc<Schema> {
self.base.get_schema()
}
fn get_event_bus(&self) -> &EventBus {
self.base.get_event_bus()
}
fn get_tr(&self) -> Transaction {
self.base.get_tr()
}
async fn command(
&mut self,
command: Arc<dyn Command>,
) -> EditorResult<()> {
debug!("正在执行命令: {}", command.name());
let mut tr = self.get_tr();
tr.transaction(command).await;
self.dispatch(tr).await
}
async fn dispatch(
&mut self,
transaction: Transaction,
) -> EditorResult<()> {
let TransactionResult { state, transactions } =
self.base.state.apply(transaction).await.map_err(|e| {
error_utils::state_error(format!(
"Failed to apply transaction: {}",
e
))
})?;
if let Some(tr) = transactions.last() {
if tr.doc_changed() {
self.base.state = Arc::new(state);
self.base.history_manager.insert(self.base.state.clone());
self.base
.event_bus
.broadcast(Event::TrApply(
Arc::new(transactions),
self.base.state.clone(),
))
.await
.map_err(|e| {
error_utils::event_error(format!(
"Failed to broadcast transaction event: {}",
e
))
})?;
}
}
Ok(())
}
async fn register_plugin(&mut self) -> EditorResult<()> {
info!("正在注册新插件");
let state = self
.get_state()
.reconfigure(StateConfig {
schema: Some(self.get_schema()),
doc: Some(self.get_state().doc()),
stored_marks: None,
plugins: Some(self.get_state().plugins().clone()),
})
.await
.map_err(|e| {
error!("重新配置状态失败: {}", e);
error_utils::state_error(format!(
"Failed to reconfigure state: {}",
e
))
})?;
self.base.state = Arc::new(state);
info!("插件注册成功");
Ok(())
}
async fn unregister_plugin(
&mut self,
plugin_key: String,
) -> EditorResult<()> {
info!("正在注销插件: {}", plugin_key);
let ps = self
.get_state()
.plugins()
.iter()
.filter(|p| p.key != plugin_key)
.cloned()
.collect();
let state = self
.get_state()
.reconfigure(StateConfig {
schema: Some(self.get_schema().clone()),
doc: Some(self.get_state().doc()),
stored_marks: None,
plugins: Some(ps),
})
.await
.map_err(|e| {
error!("重新配置状态失败: {}", e);
error_utils::state_error(format!(
"Failed to reconfigure state: {}",
e
))
})?;
self.base.state = Arc::new(state);
info!("插件注销成功");
Ok(())
}
fn undo(&mut self) {
debug!("执行撤销操作");
self.base.undo()
}
fn redo(&mut self) {
debug!("执行重做操作");
self.base.redo()
}
}