Skip to main content

butterflow_models/
step.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use ts_rs::TS;
5/// Represents a step in a node
6#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
7pub struct Step {
8    /// Human-readable name
9    pub name: String,
10
11    /// Action to perform - either using a template or running a script
12    #[serde(flatten)]
13    pub action: StepAction,
14
15    /// Environment variables specific to this step
16    #[serde(default)]
17    #[ts(optional, as = "Option<HashMap<String, String>>")]
18    pub env: Option<HashMap<String, String>>,
19}
20
21/// Represents the action a step can take - either using templates or running a script
22#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
23#[serde(rename_all = "snake_case")]
24pub enum StepAction {
25    /// Template to use for this step
26    #[serde(rename = "use")]
27    UseTemplate(TemplateUse),
28
29    /// Script to run
30    #[serde(rename = "run")]
31    RunScript(String),
32
33    /// ast-grep
34    #[serde(rename = "ast-grep")]
35    AstGrep(UseAstGrep),
36}
37
38/// Represents a template use in a step
39#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
40pub struct TemplateUse {
41    /// Template ID to use
42    pub template: String,
43
44    /// Inputs to pass to the template
45    #[serde(default)]
46    #[ts(optional, as = "Option<HashMap<String, String>>")]
47    pub inputs: HashMap<String, String>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
51#[serde(rename_all = "snake_case")]
52pub struct UseAstGrep {
53    /// Glob paths
54    pub paths: Vec<String>,
55
56    /// Query to run
57    pub query: UseAstGrepQuery,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, TS)]
61#[serde(rename_all = "snake_case")]
62pub enum UseAstGrepQuery {
63    /// Query to run
64    Inline(String),
65
66    /// Path to query
67    File(String),
68}