Skip to content

Commit

Permalink
Use cargo_metadata in guess_target and remove dependency on toml
Browse files Browse the repository at this point in the history
  • Loading branch information
louismerlin committed May 7, 2024
1 parent d74bb86 commit af4041d
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 109 deletions.
75 changes: 0 additions & 75 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,13 @@ log = { version = "0.4.21", optional = true }
semver = { version = "1.0.23", optional = true }
strip-ansi-escapes = { version = "0.2.0", optional = true }
time-humanize = { version = "0.1.3", optional = true }
toml = { version = "0.8.12", optional = true }

[features]
default = ["cli"]
cli = [
"clap",
"console",
"glob",
"toml",
"semver",
"anyhow",
"log",
Expand Down
38 changes: 6 additions & 32 deletions src/bin/cargo-ziggy/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -330,39 +330,13 @@ pub fn find_target(target: &String) -> Result<String, anyhow::Error> {
}

fn guess_target() -> Result<String> {
// TODO Use cargo-metadata and remove toml dependency

let cargo_toml_string = fs::read_to_string("Cargo.toml")
.context("⚠️ couldn't find Cargo.toml in this folder, cannot guess target")?;
let cargo_toml = cargo_toml_string.parse::<toml::Value>().context(
"⚠️ couldn't parse the Cargo.toml file in this folder, thus cannot guess the target",
)?;

if let Some(bin_section) = cargo_toml.get("bin") {
let bin_array = bin_section
.as_array()
.ok_or_else(|| anyhow!("Bin section should be an array in Cargo.toml"))?;
// If one of the bin targets uses main, we use this target
for bin_target in bin_array {
if bin_target["path"]
.as_str()
.context("Path should be a string in Cargo.toml")?
== "src/main.rs"
{
return Ok(bin_target["name"]
.as_str()
.ok_or_else(|| anyhow!("Bin name should be a string in Cargo.toml"))?
.to_string());
}
let metadata = cargo_metadata::MetadataCommand::new().exec()?;
let default_package = metadata.workspace_default_members;
if let Some(package_id) = default_package.first() {
if let Some(package) = metadata.packages.iter().find(|p| p.id == *package_id) {
return Ok(package.name.clone());
}
}
// src/main.rs exists, and either the bin array was empty, or it did not specify the main.rs bin target,
// so we use the name of the project as target.
if std::path::Path::new("src/main.rs").exists() {
return Ok(cargo_toml["package"]["name"]
.as_str()
.ok_or_else(|| anyhow!("Package name should be a string in Cargo.toml"))?
.to_string());
}

Err(anyhow!("Please specify a target"))
}

0 comments on commit af4041d

Please sign in to comment.