use serde::{Deserialize, Serialize};
use crate::{
ActflowError, Result,
common::Vars,
workflow::node::{NodeId, NodeState},
};
pub type EdgeId = String;
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, Eq, strum::AsRefStr, strum::EnumString)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum FixedHandle {
#[default]
Source,
True,
False,
FailBranch,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(untagged)]
pub enum SourceHandle {
Fixed(FixedHandle),
Node(NodeId),
}
impl Default for SourceHandle {
fn default() -> Self {
SourceHandle::Fixed(FixedHandle::default())
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Edge {
pub id: EdgeId,
pub source: NodeId,
pub target: NodeId,
pub source_handle: SourceHandle,
#[serde(default)]
pub status: NodeState,
}
impl Edge {
pub fn new(input: Vars) -> Result<Self> {
let edge = serde_json::from_value(input.into()).map_err(|e| ActflowError::Edge(format!("invalid edge input: {}", e)))?;
Ok(edge)
}
}
#[derive(Debug, Clone, Default)]
pub struct EdgeSelectOptions {
pub source_handle: SourceHandle,
}