//! The format of the `[package.metadata.binstall]` manifest. //! //! This manifest defines how a particular binary crate may be installed by Binstall. use std::collections::BTreeMap; use serde::{Deserialize, Serialize}; #[doc(inline)] pub use package_formats::*; mod package_formats; /// `binstall` metadata container /// /// Required to nest metadata under `package.metadata.binstall` #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Meta { pub binstall: Option, } /// Metadata for binary installation use. /// /// Exposed via `[package.metadata]` in `Cargo.toml` #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default)] pub struct PkgMeta { /// URL template for package downloads pub pkg_url: Option, /// Format for package downloads pub pkg_fmt: Option, /// Path template for binary files in packages pub bin_dir: Option, /// Public key for package verification (base64 encoded) pub pub_key: Option, /// Target specific overrides pub overrides: BTreeMap, } impl PkgMeta { /// Merge configuration overrides into object pub fn merge(&mut self, pkg_override: &PkgOverride) { if let Some(o) = &pkg_override.pkg_url { self.pkg_url = Some(o.clone()); } if let Some(o) = &pkg_override.pkg_fmt { self.pkg_fmt = Some(*o); } if let Some(o) = &pkg_override.bin_dir { self.bin_dir = Some(o.clone()); } } /// Merge configuration overrides into object /// /// * `pkg_overrides` - ordered in preference pub fn merge_overrides<'a, It>(&self, pkg_overrides: It) -> Self where It: IntoIterator + Clone, { Self { pkg_url: pkg_overrides .clone() .into_iter() .find_map(|pkg_override| pkg_override.pkg_url.clone()) .or_else(|| self.pkg_url.clone()), pkg_fmt: pkg_overrides .clone() .into_iter() .find_map(|pkg_override| pkg_override.pkg_fmt) .or(self.pkg_fmt), bin_dir: pkg_overrides .into_iter() .find_map(|pkg_override| pkg_override.bin_dir.clone()) .or_else(|| self.bin_dir.clone()), pub_key: self.pub_key.clone(), overrides: Default::default(), } } } /// Target specific overrides for binary installation /// /// Exposed via `[package.metadata.TARGET]` in `Cargo.toml` #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default)] pub struct PkgOverride { /// URL template override for package downloads pub pkg_url: Option, /// Format override for package downloads pub pkg_fmt: Option, /// Path template override for binary files in packages pub bin_dir: Option, } #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct BinMeta { /// Binary name pub name: String, /// Binary template path (within package) pub path: String, }