snark_tool/procedure/
procedure_chain.rs1use crate::graph::graph::GraphConstructor;
2use crate::graph::undirected::UndirectedGraph;
3use crate::procedure::configuration::ProcedureConfig;
4use crate::procedure::procedure::{GraphProperties, Procedure, Result};
5use crate::procedure::procedure_registry::ProcedureRegistry;
6
7pub struct ProcedureChain<G: UndirectedGraph> {
8 _proc_registry: ProcedureRegistry<G>,
9 procedures: Vec<Box<dyn Procedure<G>>>,
10}
11
12impl<G: UndirectedGraph + GraphConstructor + Clone + 'static> ProcedureChain<G> {
13 pub fn from_procedures_config(
14 registry: ProcedureRegistry<G>,
15 configurations: Vec<ProcedureConfig>,
16 ) -> Result<Self> {
17 let mut procedures = vec![];
18 for configuration in configurations {
19 let proc = registry.create_procedure(configuration)?;
20 procedures.push(proc);
21 }
22
23 Ok(ProcedureChain {
24 _proc_registry: registry,
25 procedures,
26 })
27 }
28
29 pub fn from_procedures_and_registry(
30 procedures: Vec<Box<dyn Procedure<G>>>,
31 registry: ProcedureRegistry<G>,
32 ) -> Result<Self> {
33 Ok(Self {
34 _proc_registry: registry,
35 procedures,
36 })
37 }
38
39 pub fn from_procedures(procedures: Vec<Box<dyn Procedure<G>>>) -> Result<Self> {
40 let registry = ProcedureRegistry::new_basic();
41 Self::from_procedures_and_registry(procedures, registry)
42 }
43
44 pub fn run(&self, graphs: &mut Vec<(G, GraphProperties)>) -> Result<()> {
45 for procedure in self.procedures.iter() {
46 procedure.run(graphs)?;
47 }
48 Ok(())
49 }
50}