pub mod branch;
pub mod connector;
pub mod edge;
pub mod topo;
pub mod transform;
pub mod validate;
pub use branch::{BranchCondition, BranchNode, ParamRef};
pub use connector::{ConnectorNode, IdempotencyConfig, IdempotencyStrategy};
pub use edge::{Edge, EdgeCondition};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub use transform::{FieldMapping, FieldMappingSpec, TransformNode, TransformType};
pub use validate::{ValidationDiagnostic, ValidationError, ValidationRule};
use crate::id::{FlowId, NodeId};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FlowSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<FlowId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub nodes: Vec<Node>,
pub edges: Vec<Edge>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<Value>,
}
impl FlowSpec {
pub fn validate(&self) -> Result<(), ValidationError> {
validate::validate(self)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Node {
pub id: NodeId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
pub node_type: NodeType,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum NodeType {
Connector(ConnectorNode),
Transform(TransformNode),
Branch(BranchNode),
}