use crate::AddMetadata;
use std::fmt::Debug;
#[derive(clap::Parser, Debug, Clone, Default)]
#[non_exhaustive]
pub struct AddMetadataOpts {
#[clap(long, value_name = "NAME", conflicts_with = "clear_name")]
pub name: Option<String>,
#[clap(long, conflicts_with = "name")]
pub clear_name: bool,
#[clap(long, value_parser = parse_key_value, value_name = "NAME=VERSION")]
pub language: Vec<(String, String)>,
#[clap(long = "processed-by", value_parser = parse_key_value, value_name="NAME=VERSION")]
pub processed_by: Vec<(String, String)>,
#[clap(long, value_parser = parse_key_value, value_name="NAME=VERSION")]
pub sdk: Vec<(String, String)>,
#[clap(long, value_name = "NAME", conflicts_with = "clear_authors")]
#[cfg(feature = "oci")]
pub authors: Option<crate::Authors>,
#[clap(long, conflicts_with = "authors")]
#[cfg(feature = "oci")]
pub clear_authors: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_description")]
#[cfg(feature = "oci")]
pub description: Option<crate::Description>,
#[clap(long, conflicts_with = "description")]
#[cfg(feature = "oci")]
pub clear_description: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_licenses")]
#[cfg(feature = "oci")]
pub licenses: Option<crate::Licenses>,
#[clap(long, conflicts_with = "licenses")]
#[cfg(feature = "oci")]
pub clear_licenses: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_source")]
#[cfg(feature = "oci")]
pub source: Option<crate::Source>,
#[clap(long, conflicts_with = "source")]
#[cfg(feature = "oci")]
pub clear_source: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_homepage")]
#[cfg(feature = "oci")]
pub homepage: Option<crate::Homepage>,
#[clap(long, conflicts_with = "homepage")]
#[cfg(feature = "oci")]
pub clear_homepage: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_revision")]
#[cfg(feature = "oci")]
pub revision: Option<crate::Revision>,
#[clap(long, conflicts_with = "revision")]
#[cfg(feature = "oci")]
pub clear_revision: bool,
#[clap(long, value_name = "NAME", conflicts_with = "clear_version")]
#[cfg(feature = "oci")]
pub version: Option<crate::Version>,
#[clap(long, conflicts_with = "version")]
#[cfg(feature = "oci")]
pub clear_version: bool,
}
pub(crate) fn parse_key_value(s: &str) -> anyhow::Result<(String, String)> {
s.split_once('=')
.map(|(k, v)| (k.to_owned(), v.to_owned()))
.ok_or_else(|| anyhow::anyhow!("expected KEY=VALUE"))
}
impl From<AddMetadataOpts> for AddMetadata {
fn from(value: AddMetadataOpts) -> Self {
let mut add = AddMetadata::default();
if let Some(name) = value.name {
add.name = crate::AddMetadataField::Set(name);
} else if value.clear_name {
add.name = crate::AddMetadataField::Clear;
}
add.language = value.language;
add.processed_by = value.processed_by;
add.sdk = value.sdk;
#[cfg(feature = "oci")]
{
if let Some(authors) = value.authors {
add.authors = crate::AddMetadataField::Set(authors);
} else if value.clear_authors {
add.authors = crate::AddMetadataField::Clear;
}
if let Some(description) = value.description {
add.description = crate::AddMetadataField::Set(description);
} else if value.clear_description {
add.description = crate::AddMetadataField::Clear;
}
if let Some(licenses) = value.licenses {
add.licenses = crate::AddMetadataField::Set(licenses);
} else if value.clear_licenses {
add.licenses = crate::AddMetadataField::Clear;
}
if let Some(source) = value.source {
add.source = crate::AddMetadataField::Set(source);
} else if value.clear_source {
add.source = crate::AddMetadataField::Clear;
}
if let Some(homepage) = value.homepage {
add.homepage = crate::AddMetadataField::Set(homepage);
} else if value.clear_homepage {
add.homepage = crate::AddMetadataField::Clear;
}
if let Some(revision) = value.revision {
add.revision = crate::AddMetadataField::Set(revision);
} else if value.clear_revision {
add.revision = crate::AddMetadataField::Clear;
}
if let Some(version) = value.version {
add.version = crate::AddMetadataField::Set(version);
} else if value.clear_version {
add.version = crate::AddMetadataField::Clear;
}
}
add
}
}