Skip to content

Commit 0a6fe0a

Browse files
committed
refactor(toml): Generalize schema abstracting over duplicate fields
1 parent d87b92c commit 0a6fe0a

File tree

2 files changed

+51
-48
lines changed

2 files changed

+51
-48
lines changed

src/cargo/util/toml/mod.rs

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -280,19 +280,11 @@ impl schema::TomlManifest {
280280
dependencies: map_deps(config, self.dependencies.as_ref(), all)?,
281281
dev_dependencies: map_deps(
282282
config,
283-
self.dev_dependencies
284-
.as_ref()
285-
.or_else(|| self.dev_dependencies2.as_ref()),
283+
self.dev_dependencies(),
286284
schema::TomlDependency::is_version_specified,
287285
)?,
288286
dev_dependencies2: None,
289-
build_dependencies: map_deps(
290-
config,
291-
self.build_dependencies
292-
.as_ref()
293-
.or_else(|| self.build_dependencies2.as_ref()),
294-
all,
295-
)?,
287+
build_dependencies: map_deps(config, self.build_dependencies(), all)?,
296288
build_dependencies2: None,
297289
features: self.features.clone(),
298290
target: match self.target.as_ref().map(|target_map| {
@@ -305,19 +297,11 @@ impl schema::TomlManifest {
305297
dependencies: map_deps(config, v.dependencies.as_ref(), all)?,
306298
dev_dependencies: map_deps(
307299
config,
308-
v.dev_dependencies
309-
.as_ref()
310-
.or_else(|| v.dev_dependencies2.as_ref()),
300+
v.dev_dependencies(),
311301
schema::TomlDependency::is_version_specified,
312302
)?,
313303
dev_dependencies2: None,
314-
build_dependencies: map_deps(
315-
config,
316-
v.build_dependencies
317-
.as_ref()
318-
.or_else(|| v.build_dependencies2.as_ref()),
319-
all,
320-
)?,
304+
build_dependencies: map_deps(config, v.build_dependencies(), all)?,
321305
build_dependencies2: None,
322306
},
323307
))
@@ -715,10 +699,7 @@ impl schema::TomlManifest {
715699
if me.dev_dependencies.is_some() && me.dev_dependencies2.is_some() {
716700
warn_on_deprecated("dev-dependencies", package_name, "package", cx.warnings);
717701
}
718-
let dev_deps = me
719-
.dev_dependencies
720-
.as_ref()
721-
.or_else(|| me.dev_dependencies2.as_ref());
702+
let dev_deps = me.dev_dependencies();
722703
let dev_deps = process_dependencies(
723704
&mut cx,
724705
dev_deps,
@@ -729,10 +710,7 @@ impl schema::TomlManifest {
729710
if me.build_dependencies.is_some() && me.build_dependencies2.is_some() {
730711
warn_on_deprecated("build-dependencies", package_name, "package", cx.warnings);
731712
}
732-
let build_deps = me
733-
.build_dependencies
734-
.as_ref()
735-
.or_else(|| me.build_dependencies2.as_ref());
713+
let build_deps = me.build_dependencies();
736714
let build_deps = process_dependencies(
737715
&mut cx,
738716
build_deps,
@@ -767,10 +745,7 @@ impl schema::TomlManifest {
767745
if platform.build_dependencies.is_some() && platform.build_dependencies2.is_some() {
768746
warn_on_deprecated("build-dependencies", name, "platform target", cx.warnings);
769747
}
770-
let build_deps = platform
771-
.build_dependencies
772-
.as_ref()
773-
.or_else(|| platform.build_dependencies2.as_ref());
748+
let build_deps = platform.build_dependencies();
774749
let build_deps = process_dependencies(
775750
&mut cx,
776751
build_deps,
@@ -781,10 +756,7 @@ impl schema::TomlManifest {
781756
if platform.dev_dependencies.is_some() && platform.dev_dependencies2.is_some() {
782757
warn_on_deprecated("dev-dependencies", name, "platform target", cx.warnings);
783758
}
784-
let dev_deps = platform
785-
.dev_dependencies
786-
.as_ref()
787-
.or_else(|| platform.dev_dependencies2.as_ref());
759+
let dev_deps = platform.dev_dependencies();
788760
let dev_deps = process_dependencies(
789761
&mut cx,
790762
dev_deps,
@@ -1147,10 +1119,10 @@ impl schema::TomlManifest {
11471119
if me.dependencies.is_some() {
11481120
bail!("this virtual manifest specifies a [dependencies] section, which is not allowed");
11491121
}
1150-
if me.dev_dependencies.is_some() || me.dev_dependencies2.is_some() {
1122+
if me.dev_dependencies().is_some() {
11511123
bail!("this virtual manifest specifies a [dev-dependencies] section, which is not allowed");
11521124
}
1153-
if me.build_dependencies.is_some() || me.build_dependencies2.is_some() {
1125+
if me.build_dependencies().is_some() {
11541126
bail!("this virtual manifest specifies a [build-dependencies] section, which is not allowed");
11551127
}
11561128
if me.features.is_some() {
@@ -1662,7 +1634,7 @@ impl schema::TomlWorkspaceDependency {
16621634
inheritable()?.get_dependency(name, cx.root).map(|d| {
16631635
match d {
16641636
schema::TomlDependency::Simple(s) => {
1665-
if let Some(false) = self.default_features.or(self.default_features2) {
1637+
if let Some(false) = self.default_features() {
16661638
default_features_msg(name, None, cx);
16671639
}
16681640
if self.optional.is_some() || self.features.is_some() || self.public.is_some() {
@@ -1679,10 +1651,7 @@ impl schema::TomlWorkspaceDependency {
16791651
}
16801652
schema::TomlDependency::Detailed(d) => {
16811653
let mut d = d.clone();
1682-
match (
1683-
self.default_features.or(self.default_features2),
1684-
d.default_features.or(d.default_features2),
1685-
) {
1654+
match (self.default_features(), d.default_features()) {
16861655
// member: default-features = true and
16871656
// workspace: default-features = false should turn on
16881657
// default-features
@@ -1982,11 +1951,7 @@ impl<P: ResolveToPath + Clone> schema::DetailedTomlDependency<P> {
19821951
warn_on_deprecated("default-features", name_in_toml, "dependency", cx.warnings);
19831952
}
19841953
dep.set_features(self.features.iter().flatten())
1985-
.set_default_features(
1986-
self.default_features
1987-
.or(self.default_features2)
1988-
.unwrap_or(true),
1989-
)
1954+
.set_default_features(self.default_features().unwrap_or(true))
19901955
.set_optional(self.optional.unwrap_or(false))
19911956
.set_platform(cx.platform.clone());
19921957
if let Some(registry) = &self.registry {

src/cargo/util/toml/schema.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ impl TomlManifest {
4545
self.profile.is_some()
4646
}
4747

48+
pub fn dev_dependencies(&self) -> Option<&BTreeMap<String, MaybeWorkspaceDependency>> {
49+
self.dev_dependencies
50+
.as_ref()
51+
.or(self.dev_dependencies2.as_ref())
52+
}
53+
54+
pub fn build_dependencies(&self) -> Option<&BTreeMap<String, MaybeWorkspaceDependency>> {
55+
self.build_dependencies
56+
.as_ref()
57+
.or(self.build_dependencies2.as_ref())
58+
}
59+
4860
pub fn features(&self) -> Option<&BTreeMap<String, Vec<String>>> {
4961
self.features.as_ref()
5062
}
@@ -462,6 +474,12 @@ pub struct TomlWorkspaceDependency {
462474
pub unused_keys: BTreeMap<String, toml::Value>,
463475
}
464476

477+
impl TomlWorkspaceDependency {
478+
pub fn default_features(&self) -> Option<bool> {
479+
self.default_features.or(self.default_features2)
480+
}
481+
}
482+
465483
#[derive(Clone, Debug, Serialize)]
466484
#[serde(untagged)]
467485
pub enum TomlDependency<P: Clone = String> {
@@ -553,6 +571,12 @@ pub struct DetailedTomlDependency<P: Clone = String> {
553571
pub unused_keys: BTreeMap<String, toml::Value>,
554572
}
555573

574+
impl<P: Clone> DetailedTomlDependency<P> {
575+
pub fn default_features(&self) -> Option<bool> {
576+
self.default_features.or(self.default_features2)
577+
}
578+
}
579+
556580
// Explicit implementation so we avoid pulling in P: Default
557581
impl<P: Clone> Default for DetailedTomlDependency<P> {
558582
fn default() -> Self {
@@ -971,6 +995,20 @@ pub struct TomlPlatform {
971995
pub dev_dependencies2: Option<BTreeMap<String, MaybeWorkspaceDependency>>,
972996
}
973997

998+
impl TomlPlatform {
999+
pub fn dev_dependencies(&self) -> Option<&BTreeMap<String, MaybeWorkspaceDependency>> {
1000+
self.dev_dependencies
1001+
.as_ref()
1002+
.or(self.dev_dependencies2.as_ref())
1003+
}
1004+
1005+
pub fn build_dependencies(&self) -> Option<&BTreeMap<String, MaybeWorkspaceDependency>> {
1006+
self.build_dependencies
1007+
.as_ref()
1008+
.or(self.build_dependencies2.as_ref())
1009+
}
1010+
}
1011+
9741012
#[derive(Deserialize, Serialize, Debug, Clone)]
9751013
#[serde(expecting = "a lints table")]
9761014
#[serde(rename_all = "kebab-case")]

0 commit comments

Comments
 (0)