Skip to main content

async_flow/model/
system_definition.rs

1// This is free and unencumbered software released into the public domain.
2
3use super::{BlockDefinition, InputPortId, OutputPortId, SystemBuilder};
4use alloc::{collections::BTreeSet, rc::Rc, vec::Vec};
5use core::fmt::Debug;
6
7/// A system definition.
8#[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    /// Returns a system builder.
18    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}