use cargo_cyclonedx::{
config::{IncludedDependencies, SbomConfig},
format::Format,
};
use clap::{ArgGroup, Parser};
use std::path;
#[derive(Parser, Debug)]
#[clap(bin_name = "cargo")]
pub enum Opts {
#[clap(name = "cyclonedx")]
Bom(Args),
}
#[derive(Parser, Debug)]
#[clap(group(ArgGroup::new("dependencies-group").required(false).args(&["all", "top-level"])))]
pub struct Args {
#[clap(long = "manifest-path", value_name = "PATH", parse(from_os_str))]
pub manifest_path: Option<path::PathBuf>,
#[clap(long = "format", short = 'f', value_name = "FORMAT")]
pub format: Option<Format>,
#[clap(long = "verbose", short = 'v', parse(from_occurrences))]
pub verbose: u32,
#[clap(long = "quiet", short = 'q')]
pub quiet: bool,
#[clap(long = "all", short = 'a')]
pub all: bool,
#[clap(long = "top-level")]
pub top_level: bool,
}
impl Args {
pub fn as_config(&self) -> SbomConfig {
let included_dependencies = match (self.all, self.top_level) {
(true, _) => Some(IncludedDependencies::AllDependencies),
(_, true) => Some(IncludedDependencies::TopLevelDependencies),
_ => None,
};
SbomConfig {
format: self.format,
included_dependencies,
}
}
}