Skip to content

Commit

Permalink
refactor: intorduce Dependency::serialized replacing Serialize impl
Browse files Browse the repository at this point in the history
This change introduces a new method, `Dependency::serialized` which replaces the direct `Serialize` implementation on `Dependency`.

This matches the pattern used by `Package` with its `Package::serialized`, and will enable us to influence the serialization format with additional arguments.

I replaced borrowed types in `SerializedDependency` with owned variants to satisfy the borrow checker.
This matches `SerializedPackage` and shouldn't be an issue since `Dependency` is cheap to copy.
  • Loading branch information
eopb committed Sep 6, 2024
1 parent 9b5981e commit 1e2e019
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 35 deletions.
55 changes: 24 additions & 31 deletions src/cargo/core/dependency.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,52 +52,28 @@ struct Inner {
}

#[derive(Serialize)]
struct SerializedDependency<'a> {
name: &'a str,
pub struct SerializedDependency {
name: InternedString,
source: SourceId,
req: String,
kind: DepKind,
rename: Option<&'a str>,
rename: Option<InternedString>,

optional: bool,
uses_default_features: bool,
features: &'a [InternedString],
features: Vec<InternedString>,
#[serde(skip_serializing_if = "Option::is_none")]
artifact: Option<&'a Artifact>,
target: Option<&'a Platform>,
artifact: Option<Artifact>,
target: Option<Platform>,
/// The registry URL this dependency is from.
/// If None, then it comes from the default registry (crates.io).
registry: Option<&'a str>,
registry: Option<String>,

/// The file system path for a local path dependency.
#[serde(skip_serializing_if = "Option::is_none")]
path: Option<PathBuf>,
}

impl ser::Serialize for Dependency {
fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
let registry_id = self.registry_id();
SerializedDependency {
name: &*self.package_name(),
source: self.source_id(),
req: self.version_req().to_string(),
kind: self.kind(),
optional: self.is_optional(),
uses_default_features: self.uses_default_features(),
features: self.features(),
target: self.platform(),
rename: self.explicit_name_in_toml().map(|s| s.as_str()),
registry: registry_id.as_ref().map(|sid| sid.url().as_str()),
path: self.source_id().local_path(),
artifact: self.artifact(),
}
.serialize(s)
}
}

#[derive(PartialEq, Eq, Hash, Ord, PartialOrd, Clone, Debug, Copy)]
pub enum DepKind {
Normal,
Expand Down Expand Up @@ -182,6 +158,23 @@ impl Dependency {
}
}

pub fn serialized(&self) -> SerializedDependency {
SerializedDependency {
name: self.package_name(),
source: self.source_id(),
req: self.version_req().to_string(),
kind: self.kind(),
optional: self.is_optional(),
uses_default_features: self.uses_default_features(),
features: self.features().to_vec(),
target: self.inner.platform.clone(),
rename: self.explicit_name_in_toml(),
registry: self.registry_id().as_ref().map(|sid| sid.url().to_string()),
path: self.source_id().local_path(),
artifact: self.inner.artifact.clone(),
}
}

pub fn version_req(&self) -> &OptVersionReq {
&self.inner.req
}
Expand Down
2 changes: 1 addition & 1 deletion src/cargo/core/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pub use self::dependency::Dependency;
pub use self::dependency::{Dependency, SerializedDependency};
pub use self::features::{CliUnstable, Edition, Feature, Features};
pub use self::manifest::{EitherManifest, VirtualManifest};
pub use self::manifest::{Manifest, Target, TargetKind};
Expand Down
12 changes: 9 additions & 3 deletions src/cargo/core/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ use crate::core::compiler::{CompileKind, RustcTargetData};
use crate::core::dependency::DepKind;
use crate::core::resolver::features::ForceAllTargets;
use crate::core::resolver::{HasDevUnits, Resolve};
use crate::core::{Dependency, Manifest, PackageId, PackageIdSpec, SourceId, Target};
use crate::core::{
Dependency, Manifest, PackageId, PackageIdSpec, SerializedDependency, SourceId, Target,
};
use crate::core::{Summary, Workspace};
use crate::sources::source::{MaybePackage, SourceMap};
use crate::util::cache_lock::{CacheLock, CacheLockMode};
Expand Down Expand Up @@ -73,7 +75,7 @@ pub struct SerializedPackage {
license_file: Option<String>,
description: Option<String>,
source: SourceId,
dependencies: Vec<Dependency>,
dependencies: Vec<SerializedDependency>,
targets: Vec<Target>,
features: BTreeMap<InternedString, Vec<InternedString>>,
manifest_path: PathBuf,
Expand Down Expand Up @@ -224,7 +226,11 @@ impl Package {
license_file: manmeta.license_file.clone(),
description: manmeta.description.clone(),
source: summary.source_id(),
dependencies: summary.dependencies().to_vec(),
dependencies: summary
.dependencies()
.iter()
.map(Dependency::serialized)
.collect(),
targets,
features,
manifest_path: self.manifest_path().to_path_buf(),
Expand Down

0 comments on commit 1e2e019

Please sign in to comment.