jellyflow_core/core/model/
port.rs1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::core::ids::{NodeId, PortKey};
5use crate::types::TypeDesc;
6
7use super::edge::EdgeKind;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum PortDirection {
13 In,
15 Out,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
21#[serde(rename_all = "snake_case")]
22pub enum PortKind {
23 Data,
25 Exec,
27}
28
29impl PortKind {
30 pub fn edge_kind(self) -> EdgeKind {
31 match self {
32 Self::Data => EdgeKind::Data,
33 Self::Exec => EdgeKind::Exec,
34 }
35 }
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
40#[serde(rename_all = "snake_case")]
41pub enum PortCapacity {
42 Single,
44 Multi,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct Port {
51 pub node: NodeId,
53 pub key: PortKey,
55 pub dir: PortDirection,
57 pub kind: PortKind,
59 pub capacity: PortCapacity,
61
62 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub connectable: Option<bool>,
68
69 #[serde(default, skip_serializing_if = "Option::is_none")]
74 pub connectable_start: Option<bool>,
75
76 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub connectable_end: Option<bool>,
82
83 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub ty: Option<TypeDesc>,
88
89 #[serde(default)]
91 pub data: Value,
92}