Skip to main content

anodizer_core/config/
defaults.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use super::archives::ArchiveConfig;
5use super::aur_source::AurSourceConfig;
6use super::build::BuildConfig;
7use super::hooks::HookEntry;
8use super::installers::{
9    AppBundleConfig, DmgConfig, FlatpakConfig, MsiConfig, NsisConfig, PkgConfig,
10};
11use super::nfpm::NfpmConfig;
12use super::notarize::NotarizeConfig;
13use super::publishers::{
14    AurConfig, CargoPublishConfig, ChocolateyConfig, HomebrewCaskConfig, HomebrewConfig,
15    KrewConfig, NixConfig, ScoopConfig, WingetConfig,
16};
17use super::sbom::SbomConfig;
18use super::snapcraft::SnapcraftConfig;
19use super::source::SourceConfig;
20use super::upx::UpxConfig;
21use super::{ChecksumConfig, CrossStrategy, DockerSignConfig, DockerV2Config, SignConfig};
22use crate::packagers::{InstallScriptConfig, MakeselfConfig, SrpmConfig};
23
24// ---------------------------------------------------------------------------
25// Defaults
26// ---------------------------------------------------------------------------
27
28/// Workspace-level defaults that path-mirror the `CrateConfig` (and select
29/// top-level `Config`) shape. Each field here is folded into every resolved
30/// crate by `defaults_merge::apply_defaults` according to the deep-merge /
31/// merge-by-identity semantics documented in `defaults_merge`.
32///
33/// Multi-publisher fields are single-struct on both sides today: defaults
34/// supplies one struct per publisher, and per-crate `publish.*` fields are
35/// also single-struct. A future change may introduce list-or-scalar via
36/// `OneOrMany<T>` on the per-crate side so a crate can declare multiple
37/// homebrew taps / scoop buckets / etc.; the defaults side would stay
38/// single-struct and merge into the first per-crate entry by identity.
39#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
40#[serde(default, deny_unknown_fields)]
41pub struct Defaults {
42    // --- Build axis ---
43    /// Default build settings applied to every crate's builds (deep-merged
44    /// into each `CrateConfig.builds[]` entry by identity on `id`/`binary`).
45    pub builds: Option<BuildConfig>,
46    /// Default archive settings applied to all crates.
47    pub archives: Option<ArchiveConfig>,
48    /// Default source-archive settings applied to all crates.
49    pub source: Option<SourceConfig>,
50    /// Default UPX compression settings applied to all crates.
51    pub upx: Option<UpxConfig>,
52
53    // --- Packaging axis ---
54    /// Default nfpm (deb/rpm/apk) settings applied to all crates.
55    pub nfpms: Option<NfpmConfig>,
56    /// Default snapcraft settings applied to all crates.
57    pub snapcrafts: Option<SnapcraftConfig>,
58    /// Default flatpak settings applied to all crates.
59    pub flatpaks: Option<FlatpakConfig>,
60    /// Default app-bundle settings applied to all crates.
61    pub app_bundles: Option<AppBundleConfig>,
62    /// Default DMG settings applied to all crates.
63    pub dmgs: Option<DmgConfig>,
64    /// Default macOS PKG settings applied to all crates.
65    pub pkgs: Option<PkgConfig>,
66    /// Default MSI settings applied to all crates.
67    pub msis: Option<MsiConfig>,
68    /// Default NSIS settings applied to all crates.
69    pub nsis: Option<NsisConfig>,
70    /// Default makeself settings applied to all crates.
71    pub makeselves: Option<MakeselfConfig>,
72    /// Default install-script settings applied to all crates.
73    pub install_scripts: Option<InstallScriptConfig>,
74    /// Default SRPM settings applied to all crates.
75    pub srpms: Option<SrpmConfig>,
76    /// Default Docker (V2 API) image settings applied to all crates. The
77    /// `docker_v2:` spelling is still accepted via serde alias for back-compat.
78    #[serde(alias = "docker_v2")]
79    pub dockers_v2: Option<DockerV2Config>,
80
81    // --- Publish axis ---
82    /// Default publisher configurations (single-struct per publisher).
83    /// Per-crate `publish.*` entries are merged into these by identity.
84    pub publish: Option<PublishDefaults>,
85
86    // --- Sign / notarize / sbom ---
87    /// Default artifact signing settings.
88    pub sign: Option<SignConfig>,
89    /// Default binary-signing settings.
90    pub binary_signs: Option<SignConfig>,
91    /// Default Docker image signing settings.
92    pub docker_signs: Option<DockerSignConfig>,
93    /// Default macOS notarization settings.
94    pub notarize: Option<NotarizeConfig>,
95    /// Default SBOM generation settings.
96    pub sbom: Option<SbomConfig>,
97
98    // --- Cross-cutting ---
99    /// Default build targets (e.g., ["x86_64-unknown-linux-gnu", "aarch64-apple-darwin"]).
100    pub targets: Option<Vec<String>>,
101    /// Default environment variables (`KEY=VALUE` strings) hoisted across crates.
102    pub env: Option<Vec<String>>,
103    /// Default repo-committed files whose embedded release version is rewritten
104    /// at `tag` time (repo-root-relative path strings). Hoisted across crates;
105    /// folded into each crate's `version_files` by `defaults_merge` when the
106    /// crate does not set its own list. Mirrors `CrateConfig.version_files`.
107    pub version_files: Option<Vec<String>>,
108    /// Default cross-compilation strategy: auto, zigbuild, cross, or cargo.
109    /// Mirrors `CrateConfig.cross` so the strategy can be hoisted to defaults.
110    pub cross: Option<CrossStrategy>,
111    /// Default checksum settings applied to all crates.
112    /// Mirrors `CrateConfig.checksum` so checksum config can be hoisted to defaults.
113    pub checksum: Option<ChecksumConfig>,
114
115    // --- Crate-axis vs workspace-axis (mutually exclusive) ---
116    /// Crate-axis defaults marker. Only valid when top-level `crates:` is set.
117    /// Reserved for per-crate overrides keyed by crate id (future waves).
118    pub crates: Option<DefaultsCrateBlock>,
119    /// Workspace-axis defaults marker. Only valid when top-level `workspaces:` is set.
120    /// Reserved for per-workspace overrides keyed by workspace name (future waves).
121    pub workspaces: Option<DefaultsWorkspaceBlock>,
122}
123
124/// Workspace-default publishers. Each publisher is single-struct in
125/// defaults; per-crate `publish.*` may be either a single struct or a list,
126/// reconciled by the merge engine.
127#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
128#[serde(default, deny_unknown_fields)]
129pub struct PublishDefaults {
130    /// Default Homebrew formula settings.
131    pub homebrew: Option<HomebrewConfig>,
132    /// Default Homebrew Cask settings, merged into per-crate `publish.homebrew_cask`.
133    ///
134    /// Single-struct.
135    pub homebrew_cask: Option<HomebrewCaskConfig>,
136    /// Default crates.io publish settings, merged into per-crate `publish.cargo`.
137    ///
138    /// Single-struct.
139    pub cargo: Option<CargoPublishConfig>,
140    /// Default Scoop manifest settings.
141    pub scoop: Option<ScoopConfig>,
142    /// Default WinGet manifest settings.
143    pub winget: Option<WingetConfig>,
144    /// Default Chocolatey package settings.
145    pub chocolatey: Option<ChocolateyConfig>,
146    /// Default Krew (kubectl plugin manager) settings.
147    pub krew: Option<KrewConfig>,
148    /// Default Nix derivation settings.
149    pub nix: Option<NixConfig>,
150    /// Default AUR (binary) settings.
151    pub aur: Option<AurConfig>,
152    /// Default AUR (source) settings.
153    pub aur_source: Option<AurSourceConfig>,
154    /// Hooks fired once per failed publisher — same surface as
155    /// `publish.on_error` on individual crate configs. Merged into
156    /// every crate's resolved publish config.
157    pub on_error: Option<Vec<HookEntry>>,
158    /// Hooks fired once per publisher a triggered rollback reverted — same
159    /// surface as `publish.on_rollback` on individual crate configs. Merged
160    /// into every crate's resolved publish config.
161    pub on_rollback: Option<Vec<HookEntry>>,
162}
163
164/// Block under `defaults.crates:` that supplies workspace-wide fallbacks for
165/// per-crate fields. Also drives the axis-mismatch validator (present only
166/// when top-level `crates:` is non-empty).
167///
168/// `deny_unknown_fields` so that typing `defaults.crates: { foo: bar }`
169/// surfaces as a parse error rather than silently being accepted.
170#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
171#[serde(default, deny_unknown_fields)]
172pub struct DefaultsCrateBlock {
173    /// Git tag template applied to any crate that omits its own
174    /// `tag_template`. Overridden by a crate's own `tag_template` when set;
175    /// falls back to `CrateConfig::DEFAULT_TAG_TEMPLATE` when neither is set.
176    pub tag_template: Option<String>,
177}
178
179/// Marker block under `defaults.workspaces:` that signals workspace-axis
180/// defaults scope. Required to drive the axis-mismatch validator.
181/// Currently empty; future per-workspace-name overrides will live here.
182///
183/// `deny_unknown_fields` per the same rationale as `DefaultsCrateBlock`.
184#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema)]
185#[serde(default, deny_unknown_fields)]
186pub struct DefaultsWorkspaceBlock {}