protoflow_core/
block_descriptor.rs1use crate::{
4 prelude::{vec, MaybeLabeled, MaybeNamed, Vec},
5 ParameterDescriptor, PortDescriptor,
6};
7
8pub trait BlockDescriptor: AsBlockDescriptor + MaybeNamed + MaybeLabeled {
10 fn ports(&self) -> Vec<PortDescriptor> {
12 let mut result = self.inputs();
13 result.append(&mut self.outputs());
14 result
15 }
16
17 fn inputs(&self) -> Vec<PortDescriptor> {
19 vec![]
20 }
21
22 fn outputs(&self) -> Vec<PortDescriptor> {
24 vec![]
25 }
26
27 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}