Skip to main content

jellyflow_core/core/validate/
error.rs

1use 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}