use super::*;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Merge, Default)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default, rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
pub struct Package {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub authors: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edition: Option<Inheritable<Edition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rust_version: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub build: Option<OptionalFile>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace: Option<PathBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub homepage: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub readme: Option<Inheritable<OptionalFile>>,
#[serde(skip_serializing_if = "Inheritable::is_default")]
pub keywords: Inheritable<BTreeSet<String>>,
#[serde(skip_serializing_if = "Inheritable::is_default")]
pub categories: Inheritable<BTreeSet<String>>,
#[serde(skip_serializing_if = "Inheritable::is_default")]
pub exclude: Inheritable<BTreeSet<String>>,
#[serde(skip_serializing_if = "Inheritable::is_default")]
pub include: Inheritable<BTreeSet<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license_file: Option<Inheritable<PathBuf>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repository: Option<Inheritable<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_run: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autobins: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autolib: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autoexamples: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autotests: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autobenches: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publish: Option<Inheritable<Publish>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolver: Option<Resolver>,
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub metadata: BTreeMap<String, Value>,
}
impl AsTomlValue for Package {
fn as_toml_value(&self) -> Item {
let mut table = Table::new();
add_string!(self, table => name, links);
add_value!(self, table => version, edition, rust_version, build, description, homepage, documentation, readme, license, repository, default_run, publish, resolver);
if let Some(license_file) = &self.license_file {
table["license-file"] = match license_file {
Inheritable::Workspace { workspace } => {
InlineTable::from_iter([("workspace", *workspace)]).into()
}
Inheritable::Value(path) => path.to_string_lossy().as_ref().into(),
};
}
macro_rules! add_set {
($($names:ident),*) => {
$(
if !self.$names.is_default() {
table[stringify!($names)] = match &self.$names {
Inheritable::Workspace { workspace } => {
InlineTable::from_iter([("workspace", *workspace)]).into()
}
Inheritable::Value(set) => {
let mut array = Array::from_iter(set);
format_array(&mut array);
array.into()
}
}
}
)*
};
}
add_set!(categories, keywords, exclude, include);
if let Some(path) = &self.workspace {
table["workspace"] = path.to_string_lossy().as_ref().into();
}
add_if_false!(self, table => autobins, autolib, autoexamples, autotests, autobenches);
if !self.metadata.is_empty() {
let mut metadata = Table::from_iter(self.metadata.iter().filter_map(|(k, v)| {
json_to_standard_table(v).map(|v| (toml_edit::Key::from(k), v))
}));
metadata.set_implicit(true);
table["metadata"] = metadata.into();
}
table.into()
}
}