Skip to main content

butterflow_models/
node.rs

1use crate::runtime::Runtime;
2use crate::step::Step;
3use crate::strategy::Strategy;
4use crate::trigger::Trigger;
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use ts_rs::TS;
9
10/// Type of node
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS)]
12#[serde(rename_all = "lowercase")]
13pub enum NodeType {
14    /// Automatic node (runs when dependencies are satisfied)
15    Automatic,
16
17    /// Manual node (requires explicit triggering)
18    Manual,
19}
20
21/// Represents a node in a workflow
22#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
23pub struct Node {
24    /// Unique identifier for the node
25    pub id: String,
26
27    /// Human-readable name
28    pub name: String,
29
30    /// Detailed description of what the node does
31    #[serde(default)]
32    #[ts(optional=nullable)]
33    pub description: Option<String>,
34
35    /// Type of node (automatic or manual)
36    #[serde(default = "default_node_type")]
37    pub r#type: NodeType,
38
39    /// IDs of nodes that must complete before this node can run
40    #[serde(default)]
41    #[ts(optional, as = "Option<Vec<String>>")]
42    pub depends_on: Vec<String>,
43
44    /// Configuration for how the node is triggered
45    #[serde(default)]
46    #[ts(optional=nullable)]
47    pub trigger: Option<Trigger>,
48
49    /// Configuration for running multiple instances of this node
50    #[serde(default)]
51    #[ts(optional=nullable)]
52    pub strategy: Option<Strategy>,
53
54    /// Container runtime configuration
55    #[serde(default)]
56    #[ts(optional=nullable)]
57    pub runtime: Option<Runtime>,
58
59    /// Steps to execute within the node
60    pub steps: Vec<Step>,
61
62    /// Environment variables to inject into the container
63    #[serde(default)]
64    #[ts(optional, as = "Option<HashMap<String, String>>")]
65    pub env: HashMap<String, String>,
66}
67
68fn default_node_type() -> NodeType {
69    NodeType::Automatic
70}