use std::collections::HashMap;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use super::{
AppBundleConfig, ArchiveConfig, ArchivesConfig, BinstallConfig, BlobConfig, ChecksumConfig,
DmgConfig, DockerDigestConfig, DockerManifestConfig, DockerV2Config, FlatpakConfig, HookEntry,
MsiConfig, NfpmConfig, NsisConfig, PkgConfig, PublishConfig, ReleaseConfig, SnapcraftConfig,
StringOrBool, VersionSyncConfig, deserialize_archives_config, deserialize_string_or_bool_opt,
};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct BuildIgnore {
pub os: String,
pub arch: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct BuildOverride {
pub targets: Vec<String>,
#[serde(default)]
pub env: Option<Vec<String>>,
pub flags: Option<Vec<String>>,
pub features: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum CrossStrategy {
Auto,
Zigbuild,
Cross,
Cargo,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(default)]
pub struct CrateConfig {
pub name: String,
pub path: String,
pub tag_template: String,
pub version: Option<String>,
pub depends_on: Option<Vec<String>>,
pub builds: Option<Vec<BuildConfig>>,
pub cross: Option<CrossStrategy>,
#[serde(default, deserialize_with = "deserialize_archives_config")]
#[schemars(schema_with = "archives_schema")]
pub archives: ArchivesConfig,
pub checksum: Option<ChecksumConfig>,
pub release: Option<ReleaseConfig>,
pub publish: Option<PublishConfig>,
pub docker_v2: Option<Vec<DockerV2Config>>,
pub docker_digest: Option<DockerDigestConfig>,
pub docker_manifests: Option<Vec<DockerManifestConfig>>,
#[serde(alias = "nfpm")]
pub nfpms: Option<Vec<NfpmConfig>>,
pub snapcrafts: Option<Vec<SnapcraftConfig>>,
pub dmgs: Option<Vec<DmgConfig>>,
pub msis: Option<Vec<MsiConfig>>,
pub pkgs: Option<Vec<PkgConfig>>,
pub nsis: Option<Vec<NsisConfig>>,
pub app_bundles: Option<Vec<AppBundleConfig>>,
pub flatpaks: Option<Vec<FlatpakConfig>>,
pub blobs: Option<Vec<BlobConfig>>,
pub binstall: Option<BinstallConfig>,
pub version_sync: Option<VersionSyncConfig>,
pub universal_binaries: Option<Vec<UniversalBinaryConfig>>,
#[serde(default, deserialize_with = "deserialize_string_or_bool_opt")]
pub no_unique_dist_dir: Option<StringOrBool>,
}
pub(super) fn archives_schema(
generator: &mut schemars::r#gen::SchemaGenerator,
) -> schemars::schema::Schema {
let mut schema = generator.subschema_for::<Option<Vec<ArchiveConfig>>>();
if let schemars::schema::Schema::Object(ref mut obj) = schema {
obj.metadata().description = Some("Archive configurations for this crate. Set to false to disable archiving, or provide an array of archive configs.".to_owned());
}
schema
}
impl Default for CrateConfig {
fn default() -> Self {
CrateConfig {
name: String::new(),
path: String::new(),
tag_template: String::new(),
version: None,
depends_on: None,
builds: None,
cross: None,
archives: ArchivesConfig::Configs(vec![]),
checksum: None,
release: None,
publish: None,
docker_v2: None,
docker_digest: None,
docker_manifests: None,
nfpms: None,
snapcrafts: None,
dmgs: None,
msis: None,
pkgs: None,
nsis: None,
app_bundles: None,
flatpaks: None,
blobs: None,
binstall: None,
version_sync: None,
universal_binaries: None,
no_unique_dist_dir: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct UniversalBinaryConfig {
#[serde(default)]
pub id: Option<String>,
pub name_template: Option<String>,
pub replace: Option<bool>,
pub ids: Option<Vec<String>>,
pub hooks: Option<BuildHooksConfig>,
pub mod_timestamp: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct BuildConfig {
pub id: Option<String>,
pub binary: Option<String>,
#[serde(default, deserialize_with = "deserialize_string_or_bool_opt")]
pub skip: Option<StringOrBool>,
pub targets: Option<Vec<String>>,
pub features: Option<Vec<String>>,
pub no_default_features: Option<bool>,
pub env: Option<HashMap<String, HashMap<String, String>>>,
pub copy_from: Option<String>,
pub flags: Option<Vec<String>>,
pub reproducible: Option<bool>,
pub hooks: Option<BuildHooksConfig>,
pub ignore: Option<Vec<BuildIgnore>>,
pub overrides: Option<Vec<BuildOverride>>,
pub cross_tool: Option<String>,
pub mod_timestamp: Option<String>,
pub command: Option<String>,
#[serde(default, deserialize_with = "deserialize_string_or_bool_opt")]
pub no_unique_dist_dir: Option<StringOrBool>,
#[serde(default, rename = "gobinary")]
pub legacy_gobinary: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct BuildHooksConfig {
pub pre: Option<Vec<HookEntry>>,
pub post: Option<Vec<HookEntry>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
#[serde(default)]
pub struct ArchiveHooksConfig {
pub before: Option<Vec<HookEntry>>,
pub after: Option<Vec<HookEntry>>,
}