Skip to main content

alien_core/bindings/
build.rs

1//! Service-type based build binding definitions
2
3use super::BindingValue;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7/// AWS CodeBuild binding configuration
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub struct CodebuildBuildBinding {
11    /// The CodeBuild project name
12    pub project_name: BindingValue<String>,
13    /// Environment variables to pass to the build process
14    pub build_env_vars: BindingValue<HashMap<String, String>>,
15    /// Optional monitoring configuration for sending build logs
16    pub monitoring: BindingValue<Option<crate::MonitoringConfig>>,
17}
18
19/// Azure Container Apps Jobs binding configuration
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "camelCase")]
22pub struct AcaBuildBinding {
23    /// The managed environment ID for Container Apps
24    pub managed_environment_id: BindingValue<String>,
25    /// Resource group name where the Container Apps environment is located
26    pub resource_group_name: BindingValue<String>,
27    /// Environment variables to pass to the build process
28    pub build_env_vars: BindingValue<HashMap<String, String>>,
29    /// Optional managed identity ID for authentication
30    pub managed_identity_id: BindingValue<Option<String>>,
31    /// Resource prefix for generating unique job names
32    pub resource_prefix: BindingValue<String>,
33    /// Optional monitoring configuration for sending build logs
34    pub monitoring: BindingValue<Option<crate::MonitoringConfig>>,
35}
36
37/// Google Cloud Build binding configuration
38#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
39#[serde(rename_all = "camelCase")]
40pub struct CloudbuildBuildBinding {
41    /// Environment variables to pass to the build process
42    pub build_env_vars: BindingValue<HashMap<String, String>>,
43    /// Service account email for Cloud Build
44    pub service_account: BindingValue<String>,
45    /// Optional monitoring configuration for sending build logs
46    pub monitoring: BindingValue<Option<crate::MonitoringConfig>>,
47}
48
49/// Local build execution binding configuration
50#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub struct LocalBuildBinding {
53    /// The base data directory for build artifacts
54    pub data_dir: BindingValue<String>,
55    /// Environment variables to pass to the build process
56    pub build_env_vars: BindingValue<HashMap<String, String>>,
57}
58
59/// Kubernetes build execution binding configuration
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct KubernetesBuildBinding {
63    /// The Kubernetes namespace where build jobs will be created
64    pub namespace: BindingValue<String>,
65    /// The name of the ServiceAccount that has permissions to create jobs
66    pub service_account_name: BindingValue<String>,
67    /// Environment variables to pass to the build process
68    pub build_env_vars: BindingValue<HashMap<String, String>>,
69}
70
71/// Service-type based build binding that supports multiple build providers
72#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73#[serde(tag = "service", rename_all = "lowercase")]
74pub enum BuildBinding {
75    /// AWS CodeBuild
76    Codebuild(CodebuildBuildBinding),
77    /// Azure Container Apps Jobs
78    Aca(AcaBuildBinding),
79    /// Google Cloud Build
80    Cloudbuild(CloudbuildBuildBinding),
81    /// Local build execution
82    Local(LocalBuildBinding),
83    /// Kubernetes build execution
84    Kubernetes(KubernetesBuildBinding),
85}
86
87impl BuildBinding {
88    /// Creates a CodeBuild binding
89    pub fn codebuild(
90        project_name: impl Into<BindingValue<String>>,
91        build_env_vars: impl Into<BindingValue<HashMap<String, String>>>,
92        monitoring: impl Into<BindingValue<Option<crate::MonitoringConfig>>>,
93    ) -> Self {
94        Self::Codebuild(CodebuildBuildBinding {
95            project_name: project_name.into(),
96            build_env_vars: build_env_vars.into(),
97            monitoring: monitoring.into(),
98        })
99    }
100
101    /// Creates an ACA (Azure Container Apps) build binding
102    pub fn aca(
103        managed_environment_id: impl Into<BindingValue<String>>,
104        resource_group_name: impl Into<BindingValue<String>>,
105        build_env_vars: impl Into<BindingValue<HashMap<String, String>>>,
106        managed_identity_id: impl Into<BindingValue<Option<String>>>,
107        resource_prefix: impl Into<BindingValue<String>>,
108        monitoring: impl Into<BindingValue<Option<crate::MonitoringConfig>>>,
109    ) -> Self {
110        Self::Aca(AcaBuildBinding {
111            managed_environment_id: managed_environment_id.into(),
112            resource_group_name: resource_group_name.into(),
113            build_env_vars: build_env_vars.into(),
114            managed_identity_id: managed_identity_id.into(),
115            resource_prefix: resource_prefix.into(),
116            monitoring: monitoring.into(),
117        })
118    }
119
120    /// Creates a Cloud Build binding
121    pub fn cloudbuild(
122        build_env_vars: impl Into<BindingValue<HashMap<String, String>>>,
123        service_account: impl Into<BindingValue<String>>,
124        monitoring: impl Into<BindingValue<Option<crate::MonitoringConfig>>>,
125    ) -> Self {
126        Self::Cloudbuild(CloudbuildBuildBinding {
127            build_env_vars: build_env_vars.into(),
128            service_account: service_account.into(),
129            monitoring: monitoring.into(),
130        })
131    }
132
133    /// Creates a local build binding
134    pub fn local(
135        data_dir: impl Into<BindingValue<String>>,
136        build_env_vars: impl Into<BindingValue<HashMap<String, String>>>,
137    ) -> Self {
138        Self::Local(LocalBuildBinding {
139            data_dir: data_dir.into(),
140            build_env_vars: build_env_vars.into(),
141        })
142    }
143
144    /// Creates a Kubernetes build binding
145    pub fn kubernetes(
146        namespace: impl Into<BindingValue<String>>,
147        service_account_name: impl Into<BindingValue<String>>,
148        build_env_vars: impl Into<BindingValue<HashMap<String, String>>>,
149    ) -> Self {
150        Self::Kubernetes(KubernetesBuildBinding {
151            namespace: namespace.into(),
152            service_account_name: service_account_name.into(),
153            build_env_vars: build_env_vars.into(),
154        })
155    }
156}