use {
crate::{distribution::Bundle, PkgResult},
serde::{Deserialize, Serialize},
std::io::Read,
};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct PackageInfo {
pub auth: String,
#[serde(rename = "deleteObsoleteLanguages")]
pub delete_obsolete_languages: Option<bool>,
#[serde(rename = "followSymLinks")]
pub follow_symlinks: Option<bool>,
pub format_version: u8,
pub generator_version: Option<String>,
pub identifier: String,
pub install_location: Option<String>,
#[serde(rename = "minimumSystemVersion")]
pub minimum_system_version: Option<bool>,
pub overwrite_permissions: Option<bool>,
pub postinstall_action: Option<String>,
pub preserve_xattr: Option<bool>,
pub relocatable: Option<bool>,
#[serde(rename = "useHFSPlusCompression")]
pub use_hfs_plus_compression: Option<bool>,
pub version: u32,
#[serde(default)]
pub atomic_update_bundle: Vec<BundleRef>,
#[serde(default)]
pub bundle: Vec<Bundle>,
#[serde(default)]
pub bundle_version: Vec<BundleRef>,
#[serde(default)]
pub dont_obsolete: Vec<File>,
pub install_at_startup: Vec<File>,
#[serde(default)]
pub patch: Vec<File>,
pub payload: Option<Payload>,
#[serde(default)]
pub relocate: Vec<BundleRef>,
#[serde(default)]
pub scripts: Vec<Script>,
#[serde(default)]
pub strict_identifiers: Vec<BundleRef>,
#[serde(default)]
pub update_bundle: Vec<BundleRef>,
#[serde(default)]
pub upgrade_bundle: Vec<BundleRef>,
}
impl Default for PackageInfo {
fn default() -> Self {
Self {
auth: "none".into(),
format_version: 2,
generator_version: Some("rust-apple-flat-package".to_string()),
identifier: "".to_string(),
version: 0,
..Default::default()
}
}
}
impl PackageInfo {
pub fn from_reader(reader: impl Read) -> PkgResult<Self> {
let mut de = serde_xml_rs::Deserializer::new_from_reader(reader);
Ok(Self::deserialize(&mut de)?)
}
pub fn from_xml(s: &str) -> PkgResult<Self> {
let mut de = serde_xml_rs::Deserializer::new_from_reader(s.as_bytes())
.non_contiguous_seq_elements(true);
Ok(Self::deserialize(&mut de)?)
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct File {
pub path: String,
pub required_sha1: Option<String>,
pub sha1: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Payload {
#[serde(rename = "numberOfFiles")]
pub number_of_files: u64,
#[serde(rename = "installKBytes")]
pub install_kbytes: u64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BundleRef {
pub id: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum Script {
#[serde(rename = "preinstall")]
PreInstall(PreInstall),
#[serde(rename = "postinstall")]
PostInstall(PostInstall),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PreInstall {
pub file: String,
pub component_id: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PostInstall {
pub file: String,
pub component_id: Option<String>,
}