protoflow_core/
block_descriptor.rs

1// This is free and unencumbered software released into the public domain.
2
3use crate::{
4    prelude::{vec, MaybeLabeled, MaybeNamed, Vec},
5    ParameterDescriptor, PortDescriptor,
6};
7
8/// A block is an autonomous unit of computation in a system.
9pub trait BlockDescriptor: AsBlockDescriptor + MaybeNamed + MaybeLabeled {
10    /// A description of this block's I/O ports.
11    fn ports(&self) -> Vec<PortDescriptor> {
12        let mut result = self.inputs();
13        result.append(&mut self.outputs());
14        result
15    }
16
17    /// A description of this block's input ports.
18    fn inputs(&self) -> Vec<PortDescriptor> {
19        vec![]
20    }
21
22    /// A description of this block's output ports.
23    fn outputs(&self) -> Vec<PortDescriptor> {
24        vec![]
25    }
26
27    /// A description of this block's parameters.
28    fn parameters(&self) -> Vec<ParameterDescriptor> {
29        vec![]
30    }
31}
32
33pub trait AsBlockDescriptor {
34    fn as_block_descriptor(&self) -> &dyn BlockDescriptor;
35}
36
37impl<T: BlockDescriptor + Sized> AsBlockDescriptor for T {
38    fn as_block_descriptor(&self) -> &dyn BlockDescriptor {
39        self
40    }
41}
42
43#[cfg(feature = "serde")]
44impl serde::Serialize for &dyn BlockDescriptor {
45    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
46    where
47        S: serde::Serializer,
48    {
49        use serde::ser::SerializeStruct;
50        let mut state = serializer.serialize_struct("BlockDescriptor", 5)?;
51        state.serialize_field("name", &self.name())?;
52        state.serialize_field("label", &self.label())?;
53        state.serialize_field("parameters", &self.parameters())?;
54        state.serialize_field("inputs", &self.inputs())?;
55        state.serialize_field("outputs", &self.outputs())?;
56        state.end()
57    }
58}