use super::bundle;
use super::deps;
use super::error::PackageError;
use super::target::host_target_triple;
use super::timestamp::rfc3339_now;
use super::version::read_framework_version;
use super::workspace::discover_workspace_root;
use crate::cli::PackageOptions;
use crate::error::CommandError;
use crate::project;
pub(crate) fn execute(options: PackageOptions) -> Result<(), CommandError> {
let project = project::discover()?;
if !options.no_build {
println!("package running build precondition");
super::super::build::execute()?;
}
let app_root = project.root();
let release_binary = app_root
.join("target")
.join("release")
.join(&project.backend_binary);
if !release_binary.is_file() {
return Err(CommandError::from(PackageError::Missing {
what: "release binary",
path: release_binary,
}));
}
let public_build = app_root.join("public").join("build");
if !public_build.is_dir() {
return Err(CommandError::from(PackageError::Missing {
what: "frontend build",
path: public_build,
}));
}
let target_triple = host_target_triple();
let target_label = options
.target_label
.unwrap_or_else(|| format!("{}-{}", project.backend_package, target_triple));
let framework_version = read_framework_version(app_root)?;
let created_at = rfc3339_now();
let framework_root = discover_workspace_root(app_root);
let lockfile = framework_root.join("Cargo.lock");
let dependencies = deps::read_dependencies(&lockfile).unwrap_or_default();
let dist_root = app_root.join("dist");
let bundle = bundle::assemble(
&dist_root,
&target_label,
&release_binary,
&public_build,
&project.backend_package,
&framework_version,
&target_triple,
&created_at,
&framework_root,
app_root,
dependencies,
)
.map_err(CommandError::from)?;
println!(
"package bundle at {} ({} files)",
bundle.root.display(),
bundle.files.len()
);
println!(
"package verify with: sha256sum -c {}/checksums.sha256",
bundle.root.display()
);
Ok(())
}