Skip to main content

jellyflow_runtime/runtime/conformance/scenario/action/
connection.rs

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