jellyflow_runtime/runtime/conformance/scenario/action/
connection.rs1use serde::{Deserialize, Serialize};
2
3use crate::runtime::connection::{
4 ConnectEdgeRequest, ConnectionTargetCandidate, ConnectionTargetFromHandlesInput,
5 ConnectionTargetInput, ReconnectEdgeRequest, ResolvedConnectionTarget,
6};
7use crate::runtime::events::ConnectStart;
8use jellyflow_core::core::CanvasPoint;
9use jellyflow_core::interaction::NodeGraphConnectionMode;
10
11use super::ConformanceAction;
12
13pub(super) fn kind(action: &ConformanceAction) -> Option<&'static str> {
14 Some(match action {
15 ConformanceAction::AssertConnectionTarget { .. } => "assert_connection_target",
16 ConformanceAction::AssertConnectionTargetFromHandles { .. } => {
17 "assert_connection_target_from_handles"
18 }
19 ConformanceAction::ApplyConnectEdge { .. } => "apply_connect_edge",
20 ConformanceAction::ApplyConnectEdgeSession { .. } => "apply_connect_edge_session",
21 ConformanceAction::ApplyReconnectEdge { .. } => "apply_reconnect_edge",
22 _ => return None,
23 })
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27pub struct ConformanceConnectionTargetFromHandlesInput {
28 pub pointer: CanvasPoint,
29 pub radius: f32,
30 pub from: crate::runtime::connection::ConnectionHandleRef,
31 pub candidates: Vec<ConnectionTargetCandidate>,
32 pub mode: NodeGraphConnectionMode,
33 #[serde(default = "default_connection_validity")]
34 pub is_valid_connection: bool,
35}
36
37impl ConformanceConnectionTargetFromHandlesInput {
38 pub(crate) fn as_runtime(&self) -> ConnectionTargetFromHandlesInput<'_> {
39 ConnectionTargetFromHandlesInput::new(
40 self.pointer,
41 self.radius,
42 self.from,
43 &self.candidates,
44 self.mode,
45 )
46 .with_connection_validity(self.is_valid_connection)
47 }
48
49 fn from_runtime(input: ConnectionTargetFromHandlesInput<'_>) -> Self {
50 Self {
51 pointer: input.pointer,
52 radius: input.radius,
53 from: input.from,
54 candidates: input.candidates.to_vec(),
55 mode: input.mode,
56 is_valid_connection: input.is_valid_connection,
57 }
58 }
59}
60
61fn default_connection_validity() -> bool {
62 true
63}
64
65impl ConformanceAction {
66 pub fn assert_connection_target(
67 input: ConnectionTargetInput,
68 expected: ResolvedConnectionTarget,
69 ) -> Self {
70 Self::AssertConnectionTarget { input, expected }
71 }
72
73 pub fn assert_connection_target_from_handles(
74 input: ConnectionTargetFromHandlesInput<'_>,
75 expected: ResolvedConnectionTarget,
76 ) -> Self {
77 Self::AssertConnectionTargetFromHandles {
78 input: ConformanceConnectionTargetFromHandlesInput::from_runtime(input),
79 expected,
80 }
81 }
82
83 pub fn apply_connect_edge(request: ConnectEdgeRequest) -> Self {
84 Self::ApplyConnectEdge { request }
85 }
86
87 pub fn apply_connect_edge_session(start: ConnectStart, request: ConnectEdgeRequest) -> Self {
88 Self::ApplyConnectEdgeSession { start, request }
89 }
90
91 pub fn apply_reconnect_edge(request: ReconnectEdgeRequest) -> Self {
92 Self::ApplyReconnectEdge { request }
93 }
94}