mf_state/
transaction.rs

1use std::ops::{Deref, DerefMut};
2use std::sync::atomic::{AtomicU64, Ordering};
3use std::sync::Arc;
4
5use async_trait::async_trait;
6use mf_model::mark::Mark;
7use mf_model::node_type::NodeEnum;
8use mf_model::types::NodeId;
9use mf_transform::TransformResult;
10use serde_json::Value;
11
12use super::state::State;
13use mf_model::node_pool::NodePool;
14use mf_transform::attr_step::AttrStep;
15use mf_transform::node_step::{AddNodeStep, RemoveNodeStep};
16use mf_transform::mark_step::{AddMarkStep, RemoveMarkStep};
17use mf_transform::transform::{Transform};
18use std::fmt::Debug;
19
20static IDS: AtomicU64 = AtomicU64::new(1);
21pub fn get_transaction_id() -> u64 {
22    //生成 全局自增的版本号,用于兼容性
23    IDS.fetch_add(1, Ordering::SeqCst)
24}
25
26/// 定义可执行的命令接口
27/// 要求实现 Send + Sync 以支持并发操作,并实现 Debug 以支持调试
28#[async_trait]
29pub trait Command: Send + Sync + Debug {
30    async fn execute(
31        &self,
32        tr: &mut Transaction,
33    ) -> TransformResult<()>;
34    fn name(&self) -> String;
35}
36/// 事务结构体,用于管理文档的修改操作
37#[derive(Debug, Clone)]
38pub struct Transaction {
39    /// 存储元数据的哈希表,支持任意类型数据
40    pub meta: im::HashMap<String, Arc<dyn std::any::Any>>,
41    /// 事务的时间戳
42    pub id: u64,
43    transform: Transform,
44}
45unsafe impl Send for Transaction {}
46unsafe impl Sync for Transaction {}
47impl Deref for Transaction {
48    type Target = Transform;
49
50    fn deref(&self) -> &Self::Target {
51        &self.transform
52    }
53}
54
55impl DerefMut for Transaction {
56    fn deref_mut(&mut self) -> &mut Self::Target {
57        &mut self.transform
58    }
59}
60
61impl Transaction {
62    /// 创建新的事务实例
63    /// state: 当前状态对象
64    /// 返回: Transaction 实例
65    pub fn new(state: &State) -> Self {
66        let node = state.doc();
67        let schema = state.schema();
68        Transaction {
69            meta: im::HashMap::new(),
70            id: get_transaction_id(),
71            transform: Transform::new(node, schema),
72        }
73    }
74    pub fn merge(
75        &mut self,
76        other: &mut Self,
77    ) {
78        // 使用批量应用来优化性能
79        let steps_to_apply: Vec<_> = other.steps.iter().cloned().collect();
80        if let Err(e) = self.apply_steps_batch(steps_to_apply) {
81            eprintln!("批量应用步骤失败: {}", e);
82        }
83    }
84    /// 获取当前文档状态
85    pub fn doc(&self) -> Arc<NodePool> {
86        self.transform.doc()
87    }
88    /// 设置节点属性
89    /// id: 节点ID
90    /// values: 属性键值对
91    pub fn set_node_attribute(
92        &mut self,
93        id: String,
94        values: im::HashMap<String, Value>,
95    ) -> TransformResult<()> {
96        self.step(Arc::new(AttrStep::new(id, values)))?;
97        Ok(())
98    }
99    /// 添加新节点
100    /// parent_id: 父节点ID
101    /// node: 要添加的节点
102    pub fn add_node(
103        &mut self,
104        parent_id: NodeId,
105        nodes: Vec<NodeEnum>,
106    ) -> TransformResult<()> {
107        self.step(Arc::new(AddNodeStep::new(parent_id, nodes)))?;
108        Ok(())
109    }
110    /// 删除节点
111    /// id: 节点ID
112    /// nodes: 要删除的节点
113    pub fn remove_node(
114        &mut self,
115        parent_id: NodeId,
116        node_ids: Vec<NodeId>,
117    ) -> TransformResult<()> {
118        self.step(Arc::new(RemoveNodeStep::new(parent_id, node_ids)))?;
119        Ok(())
120    }
121    /// 添加标记
122    /// id: 节点ID
123    /// marks: 要添加的标记
124    pub fn add_mark(
125        &mut self,
126        id: NodeId,
127        marks: Vec<Mark>,
128    ) -> TransformResult<()> {
129        self.step(Arc::new(AddMarkStep::new(id, marks)))?;
130        Ok(())
131    }
132    /// 删除标记
133    /// id: 节点ID
134    /// marks: 要删除的标记
135    pub fn remove_mark(
136        &mut self,
137        id: NodeId,
138        mark_types: Vec<String>,
139    ) -> TransformResult<()> {
140        self.step(Arc::new(RemoveMarkStep::new(id, mark_types)))?;
141        Ok(())
142    }
143    /// 设置元数据
144    /// key: 键
145    /// value: 值(支持任意类型)
146    pub fn set_meta<K, T: std::any::Any>(
147        &mut self,
148        key: K,
149        value: T,
150    ) -> &mut Self
151    where
152        K: Into<String>,
153    {
154        let key_str = key.into();
155        self.meta.insert(key_str, Arc::new(value));
156        self
157    }
158    /// 获取元数据
159    /// key: 键
160    /// 返回: Option<&T>,如果存在且类型匹配则返回Some,否则返回None
161    pub fn get_meta<T: 'static>(
162        &self,
163        key: &str,
164    ) -> Option<&Arc<T>> {
165        self.meta.get(key)?.downcast_ref::<Arc<T>>()
166    }
167}