use std::{path::PathBuf, process::Command};
use anyhow::Result;
use clap::Args;
use serde::{Deserialize, Serialize};
#[derive(Args, Debug, Serialize, Deserialize)]
pub struct PublishInput {
#[clap(short, long)]
package: Option<String>,
#[clap(long)]
manifest_path: Option<PathBuf>,
#[clap(short, long, default_value_t = true)]
release: bool,
}
pub async fn publish(args: PublishInput) -> Result<()> {
let manifest_path = match &args.manifest_path {
Some(path) => path,
None => &PathBuf::from("Cargo.toml"),
};
let metadata = super::get_metadata(manifest_path)?;
let package = super::get_package(&metadata, args.package.clone());
let _build_dir = super::get_build_dir(&metadata, args.release);
super::get_custom_metadata(&package)?;
let mut cmd = Command::new("cargo");
cmd.arg("build");
if args.release {
cmd.arg("--release");
}
if let Some(package) = args.package {
cmd.arg(format!("--package {package}"));
}
if let Some(manifest_path) = args.manifest_path {
cmd.arg(format!("--manifest-path {}", manifest_path.display()));
}
println!("Publishing package: {:#?}", cmd.get_args());
Ok(())
}