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