Skip to main content

gen_helm/
build_spec.rs

1//! Typed build spec for helm. Implements `gen_types::Spec`
2//! via `#[derive(SpecShape)]`.
3
4use indexmap::IndexMap;
5use serde::{Deserialize, Serialize};
6
7pub const SCHEMA_VERSION: u32 = 1;
8
9#[derive(Clone, Debug, Serialize, Deserialize, gen_macros::SpecShape)]
10#[spec(
11    args = "PackageArgs",
12    quirk = "crate::quirks::HelmQuirk",
13    args_field = "args",
14    root_field = "root_package",
15    members_field = "workspace_members",
16    crates_field = "packages"
17)]
18pub struct BuildSpec {
19    pub version: u32,
20    pub packages: IndexMap<String, PackageSpec>,
21    pub root_package: String,
22    pub workspace_members: Vec<String>,
23}
24
25#[derive(Clone, Debug, Serialize, Deserialize)]
26pub struct PackageSpec {
27    pub name: String,
28    pub version: String,
29    pub args: PackageArgs,
30    #[serde(default, skip_serializing_if = "Vec::is_empty")]
31    pub quirks: Vec<crate::quirks::HelmQuirk>,
32}
33
34/// Pre-shaped chart-build args matching Helm's `Chart.yaml` (helm
35/// v3 schema). Substrate's k8s consumer + FluxCD reconciler both
36/// read these fields directly.
37#[derive(Clone, Debug, Default, Serialize, Deserialize)]
38pub struct PackageArgs {
39    /// Chart name (`Chart.yaml: name`).
40    pub name: Option<String>,
41    /// Chart version (`Chart.yaml: version`) — semver.
42    pub version: Option<String>,
43    /// Optional appVersion (`Chart.yaml: appVersion`) — the version
44    /// of the app the chart deploys, not the chart itself.
45    #[serde(rename = "appVersion", skip_serializing_if = "Option::is_none")]
46    pub app_version: Option<String>,
47    /// Chart type: `application` (default) or `library`.
48    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
49    pub chart_type: Option<String>,
50    /// Description (`Chart.yaml: description`).
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub description: Option<String>,
53    /// `Chart.yaml: kubeVersion` — semver range.
54    #[serde(rename = "kubeVersion", skip_serializing_if = "Option::is_none")]
55    pub kube_version: Option<String>,
56    /// Chart dependencies (`Chart.yaml: dependencies`).
57    #[serde(skip_serializing_if = "Vec::is_empty")]
58    pub dependencies: Vec<ChartDependency>,
59    /// Maintainers list.
60    #[serde(skip_serializing_if = "Vec::is_empty")]
61    pub maintainers: Vec<ChartMaintainer>,
62    /// Free-form topic keywords.
63    #[serde(skip_serializing_if = "Vec::is_empty")]
64    pub keywords: Vec<String>,
65    /// Source URLs (e.g. github repo).
66    #[serde(skip_serializing_if = "Vec::is_empty")]
67    pub sources: Vec<String>,
68    /// `Chart.yaml: icon` — URL to the chart's icon.
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub icon: Option<String>,
71    /// `Chart.yaml: home` — chart's home URL.
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub home: Option<String>,
74    /// `Chart.yaml: deprecated` — marks chart deprecated; downstream
75    /// consumers should refuse to render.
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub deprecated: Option<bool>,
78}
79
80#[derive(Clone, Debug, Default, Serialize, Deserialize)]
81pub struct ChartDependency {
82    pub name: String,
83    pub version: String,
84    /// Repository URL (e.g. `https://charts.bitnami.com/bitnami`) or
85    /// `oci://` reference.
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub repository: Option<String>,
88    /// Alias the dep is referenced by inside parent's
89    /// `values.yaml` / templates.
90    #[serde(skip_serializing_if = "Option::is_none")]
91    pub alias: Option<String>,
92    /// Condition expression — chart is included only if the named
93    /// values entry is truthy.
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub condition: Option<String>,
96    /// Tag membership for grouped opt-in/out.
97    #[serde(skip_serializing_if = "Vec::is_empty")]
98    pub tags: Vec<String>,
99}
100
101#[derive(Clone, Debug, Default, Serialize, Deserialize)]
102pub struct ChartMaintainer {
103    pub name: String,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub email: Option<String>,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub url: Option<String>,
108}