jellyflow_core/core/validate/
error.rs1use crate::core::{
2 BindingId, EdgeId, EdgeKind, GraphId, GraphLocalBindingTarget, GroupId, NodeId, PortCapacity,
3 PortId, PortKind, SubgraphNodeError, SymbolId, SymbolRefNodeError,
4};
5
6#[derive(Debug, thiserror::Error)]
7pub enum GraphValidationError {
8 #[error("graph version mismatch: expected={expected} found={found}")]
9 UnsupportedGraphVersion { expected: u32, found: u32 },
10
11 #[error("port references missing node: port={port:?} node={node:?}")]
12 PortMissingNode { port: PortId, node: NodeId },
13
14 #[error("port is missing from owner node ports list: port={port:?} node={node:?}")]
15 PortMissingFromOwner { port: PortId, node: NodeId },
16
17 #[error("node parent references missing group: node={node:?} group={group:?}")]
18 NodeParentMissingGroup { node: NodeId, group: GroupId },
19
20 #[error("node has invalid size: node={node:?} width={width} height={height}")]
21 NodeInvalidSize {
22 node: NodeId,
23 width: f32,
24 height: f32,
25 },
26
27 #[error("node ports list references missing port: node={node:?} port={port:?}")]
28 NodePortsMissingPort { node: NodeId, port: PortId },
29
30 #[error(
31 "node ports list references port owned by another node: node={node:?} port={port:?} owner={owner:?}"
32 )]
33 NodePortsWrongOwner {
34 node: NodeId,
35 port: PortId,
36 owner: NodeId,
37 },
38
39 #[error("node ports list contains duplicates: node={node:?} port={port:?}")]
40 NodePortsDuplicate { node: NodeId, port: PortId },
41
42 #[error("edge references missing port: edge={edge:?} port={port:?}")]
43 EdgeMissingPort { edge: EdgeId, port: PortId },
44
45 #[error(
46 "edge port kinds are incompatible: edge={edge:?} from_kind={from_kind:?} to_kind={to_kind:?}"
47 )]
48 EdgeKindMismatch {
49 edge: EdgeId,
50 from_kind: PortKind,
51 to_kind: PortKind,
52 },
53
54 #[error(
55 "edge kind does not match port kind: edge={edge:?} edge_kind={edge_kind:?} port_kind={port_kind:?}"
56 )]
57 EdgeKindPortKindMismatch {
58 edge: EdgeId,
59 edge_kind: EdgeKind,
60 port_kind: PortKind,
61 },
62
63 #[error("edge duplicates an existing connection: edge={edge:?}")]
64 DuplicateEdge { edge: EdgeId },
65
66 #[error("port capacity exceeded: port={port:?} capacity={capacity:?} count={count}")]
67 PortCapacityExceeded {
68 port: PortId,
69 capacity: PortCapacity,
70 count: usize,
71 },
72
73 #[error("subgraph node missing graph_id: node={node:?}")]
74 SubgraphNodeMissingGraphId { node: NodeId },
75
76 #[error("subgraph node graph_id is not a string: node={node:?}")]
77 SubgraphNodeGraphIdNotString { node: NodeId },
78
79 #[error("subgraph node graph_id is not a valid uuid: node={node:?} value={value:?}")]
80 SubgraphNodeInvalidGraphId { node: NodeId, value: String },
81
82 #[error(
83 "subgraph node target graph is not declared in imports: node={node:?} graph_id={graph_id}"
84 )]
85 SubgraphTargetNotImported { node: NodeId, graph_id: GraphId },
86
87 #[error("symbol ref node missing symbol_id: node={node:?}")]
88 SymbolRefNodeMissingSymbolId { node: NodeId },
89
90 #[error("symbol ref node symbol_id is not a string: node={node:?}")]
91 SymbolRefNodeSymbolIdNotString { node: NodeId },
92
93 #[error("symbol ref node symbol_id is not a valid uuid: node={node:?} value={value:?}")]
94 SymbolRefNodeInvalidSymbolId { node: NodeId, value: String },
95
96 #[error(
97 "symbol ref node target symbol is not declared in symbols: node={node:?} symbol_id={symbol_id:?}"
98 )]
99 SymbolRefTargetNotDeclared { node: NodeId, symbol_id: SymbolId },
100
101 #[error(
102 "binding endpoint references missing graph-local target: binding={binding:?} target={target:?}"
103 )]
104 BindingTargetMissing {
105 binding: BindingId,
106 target: GraphLocalBindingTarget,
107 },
108}
109
110impl From<SubgraphNodeError> for GraphValidationError {
111 fn from(err: SubgraphNodeError) -> Self {
112 match err {
113 SubgraphNodeError::MissingGraphId { node } => Self::SubgraphNodeMissingGraphId { node },
114 SubgraphNodeError::GraphIdNotString { node } => {
115 Self::SubgraphNodeGraphIdNotString { node }
116 }
117 SubgraphNodeError::InvalidGraphId { node, value } => {
118 Self::SubgraphNodeInvalidGraphId { node, value }
119 }
120 }
121 }
122}
123
124impl From<SymbolRefNodeError> for GraphValidationError {
125 fn from(err: SymbolRefNodeError) -> Self {
126 match err {
127 SymbolRefNodeError::MissingSymbolId { node } => {
128 Self::SymbolRefNodeMissingSymbolId { node }
129 }
130 SymbolRefNodeError::SymbolIdNotString { node } => {
131 Self::SymbolRefNodeSymbolIdNotString { node }
132 }
133 SymbolRefNodeError::InvalidSymbolId { node, value } => {
134 Self::SymbolRefNodeInvalidSymbolId { node, value }
135 }
136 }
137 }
138}