use std::path::{Path, PathBuf};
use std::process;
use clap::Args;
use super::prepare_artifact;
#[derive(Args)]
pub struct PackageArgs {
pub input: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(long, default_value = "triton")]
pub target: String,
#[arg(long, conflicts_with_all = ["terrain", "network", "union_flag"])]
pub engine: Option<String>,
#[arg(long, conflicts_with_all = ["engine", "network", "union_flag"])]
pub terrain: Option<String>,
#[arg(long, conflicts_with_all = ["engine", "terrain", "union_flag"])]
pub network: Option<String>,
#[arg(long = "union", conflicts_with_all = ["engine", "terrain", "network"])]
pub union_flag: Option<String>,
#[arg(long, conflicts_with = "state")]
pub vimputer: Option<String>,
#[arg(long, conflicts_with = "vimputer")]
pub state: Option<String>,
#[arg(long, default_value = "release")]
pub profile: String,
#[arg(long)]
pub audit: bool,
#[arg(long)]
pub dry_run: bool,
}
pub fn cmd_package(args: PackageArgs) {
let PackageArgs {
input,
output,
target,
engine,
terrain,
network,
union_flag,
vimputer,
state,
profile,
audit,
dry_run,
} = args;
let bf = super::resolve_battlefield(
&target,
&engine,
&terrain,
&network,
&union_flag,
&vimputer,
&state,
);
let target = bf.target;
let art = prepare_artifact(&input, &target, &profile, audit);
let output_base = output.unwrap_or_else(|| {
if let Some(ref proj) = art.project {
proj.root_dir.clone()
} else {
art.entry.parent().unwrap_or(Path::new(".")).to_path_buf()
}
});
let target_display = if let Some(ref os) = art.resolved.os {
format!("{} ({})", os.name, art.resolved.vm.name)
} else {
art.resolved.vm.name.clone()
};
if dry_run {
let program_digest =
trident::hash::ContentHash(trident::poseidon2::hash_bytes(art.tasm.as_bytes()));
eprintln!("Dry run โ would package:");
eprintln!(" Name: {}", art.name);
eprintln!(" Version: {}", art.version);
eprintln!(" Target: {}", target_display);
eprintln!(" Program digest: {}", program_digest.to_hex());
eprintln!(" Padded height: {}", art.cost.padded_height);
eprintln!(
" Artifact: {}/{}.deploy/",
output_base.display(),
art.name
);
return;
}
let result = match trident::deploy::generate_artifact(
&art.name,
&art.version,
&art.tasm,
&art.file,
&art.cost,
&art.resolved.vm,
art.resolved.os.as_ref(),
&output_base,
) {
Ok(r) => r,
Err(e) => {
eprintln!("error: {}", e);
process::exit(1);
}
};
eprintln!("Packaged -> {}", result.artifact_dir.display());
eprintln!(" program.tasm: {}", result.tasm_path.display());
eprintln!(" manifest.json: {}", result.manifest_path.display());
eprintln!(" digest: {}", result.manifest.program_digest);
eprintln!(" padded height: {}", result.manifest.cost.padded_height);
eprintln!(" target: {}", target_display);
}