use super::*;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default, Merge)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default, rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
pub struct Workspace {
pub members: BTreeSet<String>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub default_members: BTreeSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[merge(with = merge_options)]
pub package: Option<PackageTemplate>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub exclude: BTreeSet<String>,
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub metadata: BTreeMap<String, Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolver: Option<Resolver>,
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
#[merge(with = merge_btree_maps)]
pub dependencies: BTreeMap<String, Dependency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lints: Option<Lints>,
}
impl AsTomlValue for Workspace {
fn as_toml_value(&self) -> Item {
let mut table = Table::new();
add_value!(self, table => resolver);
add_string_list!(self, table => members, default_members, exclude);
add_value!(self, table => package, lints);
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();
}
if !self.dependencies.is_empty() {
table["dependencies"] = Table::from_iter(
self.dependencies
.iter()
.map(|(name, dep)| (toml_edit::Key::from(name), dep.as_toml_value())),
)
.into();
}
table.into()
}
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, Merge)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default, deny_unknown_fields)]
pub struct Lints {
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub rust: BTreeMap<String, LintKind>,
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub clippy: BTreeMap<String, LintKind>,
}
impl AsTomlValue for Lints {
fn as_toml_value(&self) -> Item {
let mut table = Table::new();
table.set_implicit(true);
add_table!(self, table => rust, clippy);
table.into()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(untagged)]
pub enum LintKind {
Simple(LintLevel),
Detailed(Lint),
}
impl AsTomlValue for LintKind {
fn as_toml_value(&self) -> Item {
match self {
Self::Simple(lev) => lev.as_toml_value(),
Self::Detailed(det) => det.as_toml_value(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default, Merge)]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[serde(default, rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
pub struct PackageTemplate {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub authors: Vec<String>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub categories: BTreeSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edition: Option<Edition>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub exclude: BTreeSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub homepage: Option<String>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub include: BTreeSet<String>,
#[serde(skip_serializing_if = "BTreeSet::is_empty")]
pub keywords: BTreeSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license_file: Option<PathBuf>,
#[serde(skip_serializing_if = "Option::is_none")]
pub publish: Option<Publish>,
#[serde(skip_serializing_if = "Option::is_none")]
pub readme: Option<OptionalFile>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rust_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
impl AsTomlValue for PackageTemplate {
fn as_toml_value(&self) -> Item {
let mut table = Table::new();
add_value!(self, table => publish, edition, readme);
add_string_list!(self, table => categories, exclude, include, keywords);
add_string!(self, table =>
description,
documentation,
homepage,
license,
repository,
rust_version,
version
);
if let Some(license_file) = &self.license_file {
table["license-file"] = license_file.to_string_lossy().to_string().into();
}
table.into()
}
}