async_flow/model/
system_builder.rs1use super::{BlockDefinition, InputId, Inputs, OutputId, Outputs, SystemDefinition};
4use thiserror::Error;
5
6#[derive(Debug, Error)]
7pub enum SystemBuildError {
8 #[error("unregistered input port ID: {0}")]
9 UnregisteredInput(InputId),
10 #[error("unregistered output port ID: {0}")]
11 UnregisteredOutput(OutputId),
12}
13
14#[derive(Clone, Debug, Default)]
26pub struct SystemBuilder {
27 system: SystemDefinition,
28}
29
30impl SystemBuilder {
31 pub fn new() -> Self {
33 Self::default()
34 }
35
36 pub fn register<T: BlockDefinition>(&mut self, block: T) -> T {
38 for input in block.inputs() {
39 self.register_input(input);
40 }
41 for output in block.outputs() {
42 self.register_output(output);
43 }
44 block
45 }
46
47 pub fn register_input(&mut self, input: impl Into<InputId>) {
49 self.system.registered_inputs.insert(input.into());
50 }
51
52 pub fn register_output(&mut self, output: impl Into<OutputId>) {
54 self.system.registered_outputs.insert(output.into());
55 }
56
57 pub fn connect<T>(
62 &mut self,
63 output: &Outputs<T>,
64 input: &Inputs<T>,
65 ) -> Result<bool, SystemBuildError> {
66 if !self.system.registered_inputs.contains(&input.id()) {
67 return Err(SystemBuildError::UnregisteredInput(input.id()));
68 }
69 if !self.system.registered_outputs.contains(&output.id()) {
70 return Err(SystemBuildError::UnregisteredOutput(output.id()));
71 }
72 Ok(self.system.connections.insert((output.id(), input.id())))
73 }
74
75 pub fn build(self) -> SystemDefinition {
77 self.system
78 }
79}