refactor(toml): Rely on resolved version

This commit is contained in:
Ed Page 2024-03-19 12:40:53 -05:00
parent 631b077003
commit 6ad976912d
2 changed files with 22 additions and 6 deletions

View File

@ -194,6 +194,12 @@ pub struct TomlPackage {
pub _invalid_cargo_features: Option<InvalidCargoFeatures>,
}
impl TomlPackage {
pub fn resolved_version(&self) -> Result<Option<&semver::Version>, UnresolvedError> {
self.version.as_ref().map(|v| v.resolved()).transpose()
}
}
/// An enum that allows for inheriting keys from a workspace in a Cargo.toml.
#[derive(Serialize, Copy, Clone, Debug)]
#[serde(untagged)]
@ -205,6 +211,10 @@ pub enum InheritableField<T> {
}
impl<T> InheritableField<T> {
pub fn resolved(&self) -> Result<&T, UnresolvedError> {
self.as_value().ok_or(UnresolvedError)
}
pub fn as_value(&self) -> Option<&T> {
match self {
InheritableField::Inherit(_) => None,
@ -1512,3 +1522,9 @@ impl<'de> de::Deserialize<'de> for PathValue {
Ok(PathValue(String::deserialize(deserializer)?.into()))
}
}
/// Error validating names in Cargo.
#[derive(Debug, thiserror::Error)]
#[error("manifest field was not resolved")]
#[non_exhaustive]
pub struct UnresolvedError;

View File

@ -544,13 +544,12 @@ pub fn to_real_manifest(
features.require(Feature::open_namespaces())?;
}
let version = package
package.version = package
.version
.clone()
.map(|version| field_inherit_with(version, "version", || inherit()?.version()))
.transpose()?;
package.version = version.clone().map(manifest::InheritableField::Value);
.map(|value| field_inherit_with(value, "version", || inherit()?.version()))
.transpose()?
.map(manifest::InheritableField::Value);
let rust_version = if let Some(rust_version) = &package.rust_version {
let rust_version = field_inherit_with(rust_version.clone(), "rust_version", || {
@ -990,6 +989,7 @@ pub fn to_real_manifest(
.clone()
.map(|p| manifest::InheritableField::Value(p));
let version = package.resolved_version().expect("previously resolved");
let publish = match publish {
Some(manifest::VecStringOrBool::VecString(ref vecstring)) => Some(vecstring.clone()),
Some(manifest::VecStringOrBool::Bool(false)) => Some(vec![]),
@ -1004,7 +1004,7 @@ pub fn to_real_manifest(
let pkgid = PackageId::new(
package.name.as_str().into(),
version
.clone()
.cloned()
.unwrap_or_else(|| semver::Version::new(0, 0, 0)),
source_id,
);