worldinterface_core/flowspec/
mod.rs1pub mod branch;
9pub mod connector;
10pub mod edge;
11pub mod topo;
12pub mod transform;
13pub mod validate;
14
15pub use branch::{BranchCondition, BranchNode, ParamRef};
16pub use connector::{ConnectorNode, IdempotencyConfig, IdempotencyStrategy};
17pub use edge::{Edge, EdgeCondition};
18use serde::{Deserialize, Serialize};
19use serde_json::Value;
20pub use transform::{FieldMapping, FieldMappingSpec, TransformNode, TransformType};
21pub use validate::{ValidationDiagnostic, ValidationError, ValidationRule};
22
23use crate::id::{FlowId, NodeId};
24
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27pub struct FlowSpec {
28 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub id: Option<FlowId>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub name: Option<String>,
35 pub nodes: Vec<Node>,
37 pub edges: Vec<Edge>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub params: Option<Value>,
42}
43
44impl FlowSpec {
45 pub fn validate(&self) -> Result<(), ValidationError> {
47 validate::validate(self)
48 }
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
53pub struct Node {
54 pub id: NodeId,
56 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub label: Option<String>,
59 pub node_type: NodeType,
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
65#[serde(rename_all = "snake_case")]
66pub enum NodeType {
67 Connector(ConnectorNode),
69 Transform(TransformNode),
71 Branch(BranchNode),
73}