moduforge_transform/
attr_step.rs1use 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 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}