use super::PackageArtifact;
use super::util::copy_dir_recursive;
use crate::core::config::ResolvedCrateConfig;
use crate::publish::platform::RustTarget;
use anyhow::{Context, Result};
use std::fs;
use std::path::Path;
pub fn package_zig(
config: &ResolvedCrateConfig,
target: &RustTarget,
workspace_root: &Path,
output_dir: &Path,
version: &str,
) -> Result<PackageArtifact> {
let lib_name = config.ffi_lib_name();
let header_name = config.ffi_header_name();
let crate_name = &config.name;
let pkg_dir = config.package_dir(crate::core::config::extras::Language::Zig);
let pkg_name = format!("{crate_name}-v{version}");
let staging = output_dir.join(&pkg_name);
if staging.exists() {
fs::remove_dir_all(&staging)?;
}
fs::create_dir_all(&staging)?;
let pkg_src = workspace_root.join(&pkg_dir);
if !pkg_src.exists() {
anyhow::bail!("Zig package directory not found: {}", pkg_dir);
}
copy_dir_recursive(&pkg_src, &staging).context("copying Zig package")?;
let lib_dir = staging.join("lib");
let include_dir = staging.join("include");
fs::create_dir_all(&lib_dir)?;
fs::create_dir_all(&include_dir)?;
let shared_lib = target.shared_lib_name(&lib_name);
let shared_src = super::find_built_artifact(workspace_root, target, &shared_lib)
.with_context(|| format!("locating built FFI artifact `{shared_lib}` for Zig package"))?;
fs::copy(&shared_src, lib_dir.join(&shared_lib)).context("copying FFI .so into Zig package")?;
let ffi_crate_dir = crate::publish::ffi_stage::find_ffi_crate_dir_pub(config, workspace_root);
let header_src = ffi_crate_dir.join("include").join(&header_name);
if !header_src.exists() {
anyhow::bail!(
"FFI C header not found at {} — run `alef build --lang=ffi` first",
header_src.display()
);
}
fs::copy(&header_src, include_dir.join(&header_name)).context("copying FFI header into Zig package")?;
let archive_name = format!("{pkg_name}.tar.gz");
let archive_path = output_dir.join(&archive_name);
super::create_tar_gz(&staging, &archive_path)?;
fs::remove_dir_all(&staging).ok();
Ok(PackageArtifact {
path: archive_path,
name: archive_name,
checksum: None,
})
}