moduforge_transform/
attr_step.rs

1use std::sync::Arc;
2
3use super::{
4    step::{Step, StepResult},
5    transform::TransformError,
6};
7use im::HashMap;
8use moduforge_model::{schema::Schema, tree::Tree, types::NodeId};
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11#[derive(Debug, Serialize, Deserialize, Clone)]
12pub struct AttrStep {
13    id: NodeId,
14    values: HashMap<String, Value>,
15}
16impl AttrStep {
17    pub fn new(
18        id: String,
19        values: HashMap<String, Value>,
20    ) -> Self {
21        AttrStep { id, values }
22    }
23}
24impl Step for AttrStep {
25    fn name(&self) -> String {
26        "attr_step".to_string()
27    }
28    fn apply(
29        &self,
30        dart: &mut Tree,
31        schema: Arc<Schema>,
32    ) -> Result<StepResult, TransformError> {
33        let _ = schema;
34        match dart.get_node(&self.id) {
35            Some(node) => {
36                let attr = &schema.nodes.get(&node.r#type).unwrap().attrs;
37                // 删除 self.values 中 attr中没有定义的属性
38                let mut new_values = self.values.clone();
39                for (key, _) in self.values.iter() {
40                    if !attr.contains_key(key) {
41                        new_values.remove(key);
42                    }
43                }
44                let result = dart.attrs(&self.id) + new_values;
45                match result {
46                    Ok(_) => Ok(StepResult::ok()),
47                    Err(e) => Ok(StepResult::fail(e.to_string())),
48                }
49            },
50            None => {
51                return Ok(StepResult::fail("节点不存在".to_string()));
52            },
53        }
54    }
55    fn serialize(&self) -> Option<Vec<u8>> {
56        serde_json::to_vec(self).ok()
57    }
58}