pub mod builder;
pub(crate) mod cache;
pub mod cargo;
pub mod cli;
pub mod config;
pub mod cratespec;
pub mod downloader;
pub mod error;
pub mod git;
pub(crate) mod helpers;
pub(crate) mod logging;
pub mod resolver;
pub mod runner;
pub(crate) mod sbom;
#[cfg(test)]
pub(crate) mod testdata;
use builder::{BuildOptions, CrateBuilder};
use cache::Cache;
use config::Config;
use cratespec::CrateSpec;
use downloader::CrateDownloader;
use error::Result;
use resolver::CrateResolver;
use std::sync::Arc;
pub struct Cgx {
resolver: Arc<dyn CrateResolver>,
downloader: Arc<dyn CrateDownloader>,
builder: Arc<dyn CrateBuilder>,
}
impl Cgx {
pub fn new(config: Config) -> Result<Self> {
tracing::debug!("Using config: {:#?}", config);
let cache = Cache::new(config.clone());
let git_client = git::GitClient::new(cache.clone());
let cargo_runner = Arc::new(cargo::find_cargo()?);
let resolver = Arc::new(resolver::create_resolver(
config.clone(),
cache.clone(),
git_client.clone(),
cargo_runner.clone(),
));
let downloader = Arc::new(downloader::create_downloader(
config.clone(),
cache.clone(),
git_client,
));
let builder = Arc::new(builder::create_builder(config, cache, cargo_runner));
Ok(Self {
resolver,
downloader,
builder,
})
}
pub fn run(&self, crate_spec: &CrateSpec, build_options: &BuildOptions) -> Result<std::path::PathBuf> {
tracing::debug!("Got crate spec: {:?}", crate_spec);
tracing::info!("Resolving crate...");
let resolved_crate = self.resolver.resolve(crate_spec)?;
tracing::info!(
"Resolved crate {}@{}; proceeding to download",
resolved_crate.name,
resolved_crate.version
);
let downloaded_crate = self.downloader.download(resolved_crate)?;
tracing::debug!("Downloaded crate to cache: {:#?}", downloaded_crate);
tracing::info!("Building crate...");
let bin_path = self.builder.build(&downloaded_crate, build_options)?;
tracing::info!("Built crate binary at: {}", bin_path.display());
Ok(bin_path)
}
#[allow(clippy::type_complexity)]
pub fn list_targets(
&self,
crate_spec: &CrateSpec,
build_options: &BuildOptions,
) -> Result<(
String,
Option<cargo_metadata::Target>,
Vec<cargo_metadata::Target>,
Vec<cargo_metadata::Target>,
)> {
let resolved_crate = self.resolver.resolve(crate_spec)?;
let crate_name = resolved_crate.name.clone();
let downloaded_crate = self.downloader.download(resolved_crate)?;
let (default, bins, examples) = self.builder.list_targets(&downloaded_crate, build_options)?;
Ok((crate_name, default, bins, examples))
}
}