diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 27c8c4e4..05b25b0a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,7 +31,7 @@ jobs: - rust: stable - rust: beta - rust: nightly - - rust: 1.56.0 + - rust: 1.75.0 steps: - uses: actions/checkout@v2 - name: Install rust diff --git a/Cargo.toml b/Cargo.toml index 8138918a..e7ad9c2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,11 +7,12 @@ description = "structured access to the output of `cargo metadata`" license = "MIT" readme = "README.md" edition = "2018" -rust-version = "1.56.0" +rust-version = "1.75.0" [dependencies] camino = { version = "1.0.7", features = ["serde1"] } cargo-platform = "0.1.2" +cargo-util-schemas = "0.2.0" derive_builder = { version = "0.12", optional = true } semver = { version = "1.0.7", features = ["serde"] } serde = { version = "1.0.136", features = ["derive"] } diff --git a/src/lib.rs b/src/lib.rs index 4c951faa..63fc3d5e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,6 +94,7 @@ pub use camino; pub use semver; use semver::Version; +use cargo_util_schemas::manifest::{FeatureName, PackageName}; #[cfg(feature = "builder")] pub use dependency::DependencyBuilder; pub use dependency::{Dependency, DependencyKind}; @@ -292,7 +293,7 @@ pub struct Node { /// Features enabled on the crate #[serde(default)] - pub features: Vec, + pub features: Vec, } #[derive(Clone, Serialize, Deserialize, Debug)] @@ -303,7 +304,7 @@ pub struct Node { pub struct NodeDep { /// The name of the dependency's library target. /// If the crate was renamed, it is the new name. - pub name: String, + pub name: PackageName, /// Package ID (opaque unique identifier) pub pkg: PackageId, /// The kinds of dependencies. @@ -347,7 +348,7 @@ pub struct DepKindInfo { pub struct Package { /// The [`name` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field) as given in the `Cargo.toml` // (We say "given in" instead of "specified in" since the `name` key cannot be inherited from the workspace.) - pub name: String, + pub name: PackageName, /// The [`version` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-version-field) as specified in the `Cargo.toml` pub version: Version, /// The [`authors` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-authors-field) as specified in the `Cargo.toml` @@ -357,6 +358,7 @@ pub struct Package { pub id: PackageId, /// The source of the package, e.g. /// crates.io or `None` for local projects. + // Note that this is NOT the same as cargo_util_schemas::RegistryName pub source: Option, /// The [`description` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-description-field) as specified in the `Cargo.toml` pub description: Option, @@ -371,7 +373,7 @@ pub struct Package { /// Targets provided by the crate (lib, bin, example, test, ...) pub targets: Vec, /// Features provided by the crate, mapped to the features required by that feature. - pub features: BTreeMap>, + pub features: BTreeMap>, /// Path containing the `Cargo.toml` pub manifest_path: Utf8PathBuf, /// The [`categories` field](https://doc.rust-lang.org/cargo/reference/manifest.html#the-categories-field) as specified in the `Cargo.toml` @@ -525,7 +527,7 @@ pub struct Target { #[serde(rename = "required-features")] /// This target is built only if these features are enabled. /// It doesn't apply to `lib` targets. - pub required_features: Vec, + pub required_features: Vec, /// Path to the main source file of the target pub src_path: Utf8PathBuf, /// Rust edition for this target diff --git a/tests/selftest.rs b/tests/selftest.rs index e6dadf77..2ad1ce4a 100644 --- a/tests/selftest.rs +++ b/tests/selftest.rs @@ -17,7 +17,7 @@ fn metadata() { let metadata = MetadataCommand::new().no_deps().exec().unwrap(); let this = &metadata.packages[0]; - assert_eq!(this.name, "cargo_metadata"); + assert_eq!(this.name.as_str(), "cargo_metadata"); assert_eq!(this.targets.len(), 3); let lib = this @@ -130,7 +130,7 @@ fn metadata_deps() { .expect("Did not find ourselves"); let this = &metadata[this_id]; - assert_eq!(this.name, "cargo_metadata"); + assert_eq!(this.name.as_str(), "cargo_metadata"); let workspace_packages = metadata.workspace_packages(); assert_eq!(workspace_packages.len(), 1); diff --git a/tests/test_samples.rs b/tests/test_samples.rs index 2f406c5b..d35edd16 100644 --- a/tests/test_samples.rs +++ b/tests/test_samples.rs @@ -8,6 +8,7 @@ use cargo_metadata::{ workspace_default_members_is_missing, ArtifactDebuginfo, CargoOpt, DependencyKind, Edition, Message, Metadata, MetadataCommand, }; +use cargo_util_schemas::manifest::FeatureName; /// Output from oldest version ever supported (1.24). /// @@ -71,7 +72,7 @@ fn old_minimal() { let meta: Metadata = serde_json::from_str(JSON_OLD_MINIMAL).unwrap(); assert_eq!(meta.packages.len(), 1); let pkg = &meta.packages[0]; - assert_eq!(pkg.name, "foo"); + assert_eq!(pkg.name.as_str(), "foo"); assert_eq!(pkg.version, semver::Version::parse("0.1.0").unwrap()); assert_eq!(pkg.authors.len(), 0); assert_eq!(pkg.id.to_string(), "foo 0.1.0 (path+file:///foo)"); @@ -143,6 +144,14 @@ macro_rules! sorted { }}; } +macro_rules! features { + ($($feat:expr),* $(,)?) => { + ::std::vec![ + $(::cargo_util_schemas::manifest::FeatureName::new(String::from($feat)).unwrap()),* + ] + }; +} + fn cargo_version() -> semver::Version { let output = std::process::Command::new("cargo") .arg("-V") @@ -214,7 +223,11 @@ fn all_the_fields() { } assert_eq!(meta.packages.len(), 9); - let all = meta.packages.iter().find(|p| p.name == "all").unwrap(); + let all = meta + .packages + .iter() + .find(|p| p.name.as_str() == "all") + .unwrap(); assert_eq!(all.version, semver::Version::parse("0.1.0").unwrap()); assert_eq!(all.authors, vec!["Jane Doe "]); assert!(all.id.to_string().contains("all")); @@ -335,7 +348,7 @@ fn all_the_fields() { assert!(!otherbin.doc); let reqfeat = get_file_name!("reqfeat.rs"); - assert_eq!(reqfeat.required_features, vec!["feat2"]); + assert_eq!(reqfeat.required_features, features!["feat2"]); let ex1 = get_file_name!("ex1.rs"); assert_eq!(ex1.kind, vec!["example".into()]); @@ -410,14 +423,14 @@ fn all_the_fields() { .iter() .find(|n| n.id.to_string().contains("bitflags")) .unwrap(); - assert_eq!(bitflags.features, vec!["default"]); + assert_eq!(bitflags.features, features!["default"]); let featdep = resolve .nodes .iter() .find(|n| n.id.to_string().contains("featdep")) .unwrap(); - assert_eq!(featdep.features, vec!["i128"]); + assert_eq!(featdep.features, features!["i128"]); let all = resolve .nodes @@ -426,10 +439,10 @@ fn all_the_fields() { .unwrap(); assert_eq!(all.dependencies.len(), 8); assert_eq!(all.deps.len(), 8); - let newname = all.deps.iter().find(|d| d.name == "newname").unwrap(); + let newname = all.deps.iter().find(|d| &*d.name == "newname").unwrap(); assert!(newname.pkg.to_string().contains("oldname")); // Note the underscore here. - let path_dep = all.deps.iter().find(|d| d.name == "path_dep").unwrap(); + let path_dep = all.deps.iter().find(|d| &*d.name == "path_dep").unwrap(); assert!(path_dep.pkg.to_string().contains("path-dep")); assert_eq!(path_dep.dep_kinds.len(), 1); let kind = &path_dep.dep_kinds[0]; @@ -439,24 +452,27 @@ fn all_the_fields() { let namedep = all .deps .iter() - .find(|d| d.name == "different_name") + .find(|d| &*d.name == "different_name") .unwrap(); assert!(namedep.pkg.to_string().contains("namedep")); - assert_eq!(sorted!(all.features), vec!["bitflags", "default", "feat1"]); + assert_eq!( + sorted!(all.features), + features!["bitflags", "default", "feat1"] + ); - let bdep = all.deps.iter().find(|d| d.name == "bdep").unwrap(); + let bdep = all.deps.iter().find(|d| &*d.name == "bdep").unwrap(); assert_eq!(bdep.dep_kinds.len(), 1); let kind = &bdep.dep_kinds[0]; assert_eq!(kind.kind, DependencyKind::Build); assert!(kind.target.is_none()); - let devdep = all.deps.iter().find(|d| d.name == "devdep").unwrap(); + let devdep = all.deps.iter().find(|d| &*d.name == "devdep").unwrap(); assert_eq!(devdep.dep_kinds.len(), 1); let kind = &devdep.dep_kinds[0]; assert_eq!(kind.kind, DependencyKind::Development); assert!(kind.target.is_none()); - let windep = all.deps.iter().find(|d| d.name == "windep").unwrap(); + let windep = all.deps.iter().find(|d| &*d.name == "windep").unwrap(); assert_eq!(windep.dep_kinds.len(), 1); let kind = &windep.dep_kinds[0]; assert_eq!(kind.kind, DependencyKind::Normal); @@ -553,7 +569,11 @@ fn current_dir() { .current_dir("tests/all/namedep") .exec() .unwrap(); - let namedep = meta.packages.iter().find(|p| p.name == "namedep").unwrap(); + let namedep = meta + .packages + .iter() + .find(|p| p.name.as_str() == "namedep") + .unwrap(); assert!(namedep.name.starts_with("namedep")); } @@ -597,7 +617,11 @@ fn advanced_feature_configuration() { .find(|n| !n.features.is_empty()) .unwrap(); - all.features.clone() + all.features + .clone() + .into_iter() + .map(FeatureName::into_inner) + .collect() } // Default behavior; tested above @@ -659,7 +683,7 @@ fn basic_workspace_root_package_exists() { .manifest_path("tests/basic_workspace/Cargo.toml") .exec() .unwrap(); - assert_eq!(meta.root_package().unwrap().name, "ex_bin"); + assert_eq!(meta.root_package().unwrap().name.as_str(), "ex_bin"); // Now with no_deps, it should still work exactly the same let meta = MetadataCommand::new() .manifest_path("tests/basic_workspace/Cargo.toml") @@ -669,7 +693,8 @@ fn basic_workspace_root_package_exists() { assert_eq!( meta.root_package() .expect("workspace root still exists when no_deps used") - .name, + .name + .as_str(), "ex_bin" ); }