use crate::types::{NodeId, PortId};
use crate::utils::{deserialize_size, deserialize_time};
use serde::{Deserialize, Serialize};
use std::{fmt, sync::Arc};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct LinkDescriptor {
pub from: OutputDescriptor,
pub to: InputDescriptor,
#[serde(default)]
#[serde(deserialize_with = "deserialize_size")]
pub shared_memory_element_size: Option<usize>,
pub shared_memory_elements: Option<usize>,
#[serde(default)]
#[serde(deserialize_with = "deserialize_time")]
pub shared_memory_backoff: Option<u64>,
}
impl std::fmt::Display for LinkDescriptor {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{} => {}", self.from, self.to)
}
}
impl LinkDescriptor {
pub fn new(from: OutputDescriptor, to: InputDescriptor) -> Self {
Self {
from,
to,
shared_memory_element_size: None,
shared_memory_elements: None,
shared_memory_backoff: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OutputDescriptor {
pub node: NodeId,
pub output: PortId,
}
impl fmt::Display for OutputDescriptor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_fmt(format_args!("{}.{}", self.node, self.output))
}
}
impl OutputDescriptor {
pub fn new(node: impl AsRef<str>, output: impl AsRef<str>) -> Self {
Self {
node: node.as_ref().into(),
output: output.as_ref().into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CompositeOutputDescriptor {
pub id: Arc<str>,
pub node: NodeId,
pub output: PortId,
}
impl CompositeOutputDescriptor {
pub fn new(id: impl AsRef<str>, node: impl AsRef<str>, output: impl AsRef<str>) -> Self {
Self {
id: id.as_ref().into(),
node: node.as_ref().into(),
output: output.as_ref().into(),
}
}
}
impl From<CompositeOutputDescriptor> for OutputDescriptor {
fn from(composite: CompositeOutputDescriptor) -> Self {
Self {
node: composite.node,
output: composite.output,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct InputDescriptor {
pub node: NodeId,
pub input: PortId,
}
impl fmt::Display for InputDescriptor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_fmt(format_args!("{}.{}", self.node, self.input))
}
}
impl InputDescriptor {
pub fn new(node: impl AsRef<str>, input: impl AsRef<str>) -> Self {
Self {
node: node.as_ref().into(),
input: input.as_ref().into(),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct CompositeInputDescriptor {
pub id: Arc<str>,
pub node: NodeId,
pub input: PortId,
}
impl CompositeInputDescriptor {
pub fn new(id: impl AsRef<str>, node: impl AsRef<str>, input: impl AsRef<str>) -> Self {
Self {
id: id.as_ref().into(),
node: node.as_ref().into(),
input: input.as_ref().into(),
}
}
}
impl From<CompositeInputDescriptor> for InputDescriptor {
fn from(composite: CompositeInputDescriptor) -> Self {
Self {
node: composite.node,
input: composite.input,
}
}
}