async_flow/model/
system_definition.rs1use super::{BlockDefinition, InputPortId, OutputPortId, SystemBuilder};
4use alloc::{collections::BTreeSet, rc::Rc, vec::Vec};
5use core::fmt::Debug;
6
7#[derive(Clone, Default)]
9pub struct SystemDefinition {
10 pub(crate) inputs: BTreeSet<InputPortId>,
11 pub(crate) outputs: BTreeSet<OutputPortId>,
12 pub(crate) blocks: Vec<BlockHandle>,
13 pub(crate) connections: BTreeSet<(OutputPortId, InputPortId)>,
14}
15
16impl SystemDefinition {
17 pub fn build() -> SystemBuilder {
19 SystemBuilder::new()
20 }
21
22 pub(crate) fn push_block<T: BlockDefinition + 'static>(&mut self, block: &Rc<T>) {
23 self.blocks.push(BlockHandle(Rc::clone(&block) as _));
24 }
25}
26
27impl Debug for SystemDefinition {
28 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
29 f.debug_struct("SystemDefinition")
30 .field(
31 "inputs",
32 &self.inputs.iter().map(|id| id.0).collect::<Vec<_>>(),
33 )
34 .field(
35 "outputs",
36 &self.outputs.iter().map(|id| id.0).collect::<Vec<_>>(),
37 )
38 .field("blocks", &self.blocks)
39 .field(
40 "connections",
41 &self
42 .connections
43 .iter()
44 .map(|(a, b)| (a.0, b.0))
45 .collect::<Vec<_>>(),
46 )
47 .finish()
48 }
49}
50
51#[derive(Clone)]
52pub(crate) struct BlockHandle(Rc<dyn BlockDefinition>);
53
54impl Debug for BlockHandle {
55 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
56 f.debug_struct(&self.0.name())
57 .field(
58 "inputs",
59 &self.0.inputs().iter().map(|id| id.0).collect::<Vec<_>>(),
60 )
61 .field(
62 "outputs",
63 &self.0.outputs().iter().map(|id| id.0).collect::<Vec<_>>(),
64 )
65 .finish()
66 }
67}