pub mod convert;
pub mod package;
use std::path::Path;
use std::process::Command;
use anyhow::{bail, Context, Result};
pub use convert::{convert, ConvertOptions, ConvertedCrate};
pub use package::{discover, PyPackage};
pub fn cargo_build(krate: &ConvertedCrate) -> Result<()> {
run_cargo(
Command::new("cargo")
.arg("build")
.arg("--release")
.current_dir(&krate.root),
"cargo build",
)
}
pub fn cargo_install(krate: &ConvertedCrate, root: Option<&Path>) -> Result<()> {
if !krate.has_binary {
bail!(
"package `{}` has no entry point; add an `if __name__ == \"__main__\":` block \
or a __main__.py to install it as a binary (use `convert` for library crates)",
krate.name
);
}
let mut cmd = Command::new("cargo");
cmd.arg("install")
.arg("--path")
.arg(&krate.root)
.arg("--force");
if let Some(root) = root {
cmd.arg("--root").arg(root);
}
run_cargo(&mut cmd, "cargo install")
}
fn run_cargo(cmd: &mut Command, what: &str) -> Result<()> {
let status = cmd
.status()
.with_context(|| format!("running {}", what))?;
if !status.success() {
bail!("{} failed with {}", what, status);
}
Ok(())
}