use cargo_metadata::{Package, Target};
use eyre::eyre;
use crate::Result;
#[derive(Debug)]
pub struct DistTargetConfigBuilder<'a> {
name: String,
metadata: &'a Target,
command: Option<clap::Command>,
#[cfg(feature = "subcommand-dist-build-bin")]
cargo_build_options: Vec<String>,
}
impl<'a> DistTargetConfigBuilder<'a> {
pub(crate) fn from_metadata(target: &'a Target) -> Self {
Self {
name: target.name.clone(),
metadata: target,
command: None,
#[cfg(feature = "subcommand-dist-build-bin")]
cargo_build_options: vec![],
}
}
pub(crate) fn target_by_name(package: &'a Package, name: &str, kind: &str) -> Result<Self> {
let target = package
.targets
.iter()
.find(|t| t.name == name && t.kind.iter().any(|k| k == kind))
.ok_or_else(|| eyre!("command not found: {name}, {kind}"))?;
Ok(Self {
name: name.to_string(),
metadata: target,
command: None,
#[cfg(feature = "subcommand-dist-build-bin")]
cargo_build_options: vec![],
})
}
pub fn command(mut self, command: clap::Command) -> Self {
self.command = Some(command);
self
}
#[cfg(feature = "subcommand-dist-build-bin")]
#[cfg_attr(docsrs, doc(cfg(feature = "subcommand-dist-build-bin")))]
pub fn cargo_build_options(
mut self,
options: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
self.cargo_build_options
.extend(options.into_iter().map(Into::into));
self
}
pub fn build(self) -> Result<DistTargetConfig<'a>> {
Ok(DistTargetConfig {
name: self.name,
metadata: self.metadata,
command: self.command,
#[cfg(feature = "subcommand-dist-build-bin")]
cargo_build_options: self.cargo_build_options,
})
}
}
#[derive(Debug)]
pub struct DistTargetConfig<'a> {
name: String,
metadata: &'a Target,
command: Option<clap::Command>,
#[cfg(feature = "subcommand-dist-build-bin")]
cargo_build_options: Vec<String>,
}
impl<'a> DistTargetConfig<'a> {
pub fn name(&self) -> &str {
&self.name
}
pub fn metadata(&self) -> &Target {
self.metadata
}
pub fn command(&self) -> Option<&clap::Command> {
self.command.as_ref()
}
#[cfg(feature = "subcommand-dist-build-bin")]
#[cfg_attr(docsrs, doc(cfg(feature = "subcommand-dist-build-bin")))]
pub fn cargo_build_options(&self) -> &[String] {
&self.cargo_build_options
}
}