use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::core::ids::{NodeId, PortKey};
use crate::types::TypeDesc;
use super::edge::EdgeKind;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PortDirection {
In,
Out,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PortKind {
Data,
Exec,
}
impl PortKind {
pub fn edge_kind(self) -> EdgeKind {
match self {
Self::Data => EdgeKind::Data,
Self::Exec => EdgeKind::Exec,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PortCapacity {
Single,
Multi,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Port {
pub node: NodeId,
pub key: PortKey,
pub dir: PortDirection,
pub kind: PortKind,
pub capacity: PortCapacity,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connectable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connectable_start: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connectable_end: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ty: Option<TypeDesc>,
#[serde(default)]
pub data: Value,
}