use serde::{Deserialize, Serialize};
use crate::core::ids::PortId;
use super::port::PortKind;
fn is_false(v: &bool) -> bool {
!*v
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EdgeKind {
Data,
Exec,
}
impl EdgeKind {
pub fn port_kind(self) -> PortKind {
match self {
Self::Data => PortKind::Data,
Self::Exec => PortKind::Exec,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Edge {
pub kind: EdgeKind,
pub from: PortId,
pub to: PortId,
#[serde(default, skip_serializing_if = "is_false")]
pub hidden: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selectable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub focusable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub interaction_width: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deletable: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reconnectable: Option<EdgeReconnectable>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum EdgeReconnectable {
Bool(bool),
Endpoint(EdgeReconnectableEndpoint),
}
impl EdgeReconnectable {
pub fn allows_source(self) -> bool {
matches!(
self,
Self::Bool(true) | Self::Endpoint(EdgeReconnectableEndpoint::Source)
)
}
pub fn allows_target(self) -> bool {
matches!(
self,
Self::Bool(true) | Self::Endpoint(EdgeReconnectableEndpoint::Target)
)
}
pub fn endpoint_flags(self) -> (bool, bool) {
(self.allows_source(), self.allows_target())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EdgeReconnectableEndpoint {
Source,
Target,
}