mf_persistence/
step_factory.rs1use std::{collections::HashMap, sync::Arc};
2
3use mf_transform::{
4 attr_step::AttrStep,
5 mark_step::AddMarkStep,
6 node_step::{AddNodeStep, MoveNodeStep, RemoveNodeStep},
7 step::Step,
8};
9use std::fmt::Debug;
10
11pub trait StepFactory: Send + Sync + Debug {
12 fn create_from_bytes(
13 &self,
14 bytes: &[u8],
15 ) -> Arc<dyn Step>;
16}
17
18#[derive(Debug)]
19pub struct StepFactoryRegistry {
20 factories: HashMap<String, Arc<dyn StepFactory>>,
21}
22
23impl Default for StepFactoryRegistry {
24 fn default() -> Self {
25 Self::new()
26 }
27}
28
29impl StepFactoryRegistry {
30 pub fn new() -> Self {
31 let mut registry = StepFactoryRegistry { factories: HashMap::new() };
32 registry.register("attr_step", Arc::new(AttrStepFactory));
34 registry.register("add_mark_step", Arc::new(AddMarkStepFactory));
36 registry.register("add_node_step", Arc::new(AddNodeStepFactory));
38 registry.register("remove_node_step", Arc::new(RemoveNodeStepFactory));
40 registry.register("move_node_step", Arc::new(MoveNodeStepFactory));
42 registry
43 }
44
45 pub fn register(
46 &mut self,
47 type_id: &str,
48 factory: Arc<dyn StepFactory>,
49 ) {
50 self.factories.insert(type_id.to_string(), factory);
51 }
52
53 pub fn create(
54 &self,
55 type_id: &str,
56 bytes: &[u8],
57 ) -> Arc<dyn Step> {
58 self.factories
59 .get(type_id)
60 .expect("Unknown step type")
61 .create_from_bytes(bytes)
62 }
63}
64
65#[derive(Debug)]
66pub struct AttrStepFactory;
67impl StepFactory for AttrStepFactory {
68 fn create_from_bytes(
69 &self,
70 bytes: &[u8],
71 ) -> Arc<dyn Step> {
72 let step: AttrStep = serde_json::from_slice(bytes).unwrap();
73 Arc::new(step)
74 }
75}
76
77#[derive(Debug)]
78pub struct AddMarkStepFactory;
79impl StepFactory for AddMarkStepFactory {
80 fn create_from_bytes(
81 &self,
82 bytes: &[u8],
83 ) -> Arc<dyn Step> {
84 let step: AddMarkStep = serde_json::from_slice(bytes).unwrap();
85 Arc::new(step)
86 }
87}
88
89#[derive(Debug)]
90pub struct AddNodeStepFactory;
91impl StepFactory for AddNodeStepFactory {
92 fn create_from_bytes(
93 &self,
94 bytes: &[u8],
95 ) -> Arc<dyn Step> {
96 let step: AddNodeStep = serde_json::from_slice(bytes).unwrap();
97 Arc::new(step)
98 }
99}
100
101#[derive(Debug)]
102pub struct RemoveNodeStepFactory;
103impl StepFactory for RemoveNodeStepFactory {
104 fn create_from_bytes(
105 &self,
106 bytes: &[u8],
107 ) -> Arc<dyn Step> {
108 let step: RemoveNodeStep = serde_json::from_slice(bytes).unwrap();
109 Arc::new(step)
110 }
111}
112
113#[derive(Debug)]
114pub struct MoveNodeStepFactory;
115impl StepFactory for MoveNodeStepFactory {
116 fn create_from_bytes(
117 &self,
118 bytes: &[u8],
119 ) -> Arc<dyn Step> {
120 let step: MoveNodeStep = serde_json::from_slice(bytes).unwrap();
121 Arc::new(step)
122 }
123}