snark_tool/procedure/
procedure_chain.rs

1use 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}