use crate::packer::PackToml;
use crate::packer::pack_toml::parse_validate_pack_toml;
use crate::support::zip;
use crate::{Error, Result};
use camino::Utf8Path;
use simple_fs::SPath;
use std::fs;
#[derive(Debug)]
pub struct PackDirData {
pub pack_file: SPath,
#[allow(unused)]
pub pack_toml: PackToml,
}
pub fn pack_dir(pack_dir: impl AsRef<Utf8Path>, dest_dir: impl AsRef<Utf8Path>) -> Result<PackDirData> {
let pack_dir = pack_dir.as_ref();
let dest_dir = dest_dir.as_ref();
let toml_path = pack_dir.join("pack.toml");
if !toml_path.exists() {
return Err(Error::AipackTomlMissing(toml_path.into()));
}
let toml_content = fs::read_to_string(&toml_path)?;
let pack_toml = parse_validate_pack_toml(&toml_content, toml_path.as_str())?;
let pack_version = &pack_toml.version;
let aipack_filename = format!("{}@{}-v{pack_version}.aipack", pack_toml.namespace, pack_toml.name);
let aipack_path = dest_dir.join(aipack_filename);
if !dest_dir.exists() {
fs::create_dir_all(dest_dir)?;
}
zip::zip_dir(pack_dir, &aipack_path)?;
Ok(PackDirData {
pack_file: aipack_path.into(),
pack_toml,
})
}
#[cfg(test)]
#[path = "../_tests/tests_packer_impl.rs"]
mod tests_packer_impl;