Merge pull request #2452

fix parsing of cargo locate-project output
This commit is contained in:
Remo Senekowitsch
2026-09-29 12:16:22 +02:00
committed by GitHub
+9 -16
View File
@@ -3,7 +3,6 @@ use crossterm::{
QueueableCommand, QueueableCommand,
style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor}, style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor},
}; };
use serde::Deserialize;
use std::{ use std::{
env::{current_dir, set_current_dir}, env::{current_dir, set_current_dir},
fs::{self, create_dir}, fs::{self, create_dir},
@@ -17,22 +16,17 @@ use crate::{
info_file::InfoFile, term::press_enter_prompt, info_file::InfoFile, term::press_enter_prompt,
}; };
#[derive(Deserialize)]
struct CargoLocateProject<'a> {
#[serde(borrow)]
root: &'a Path,
}
pub fn init() -> Result<()> { pub fn init() -> Result<()> {
let rustlings_dir = Path::new("rustlings"); let rustlings_dir = Path::new("rustlings");
if rustlings_dir.exists() { if rustlings_dir.exists() {
bail!(RUSTLINGS_DIR_ALREADY_EXISTS_ERR); bail!(RUSTLINGS_DIR_ALREADY_EXISTS_ERR);
} }
let locate_project_output = Command::new("cargo") let mut locate_project_output = Command::new("cargo")
.arg("locate-project") .arg("locate-project")
.arg("-q") .arg("-q")
.arg("--workspace") .arg("--workspace")
.arg("--message-format=plain")
.stdin(Stdio::null()) .stdin(Stdio::null())
.stderr(Stdio::null()) .stderr(Stdio::null())
.output() .output()
@@ -66,15 +60,14 @@ pub fn init() -> Result<()> {
bail!(IN_INITIALIZED_DIR_ERR); bail!(IN_INITIALIZED_DIR_ERR);
} }
let workspace_manifest = // Remove newline
serde_json::de::from_slice::<CargoLocateProject>(&locate_project_output.stdout) locate_project_output.stdout.pop();
.context(
"Failed to read the field `root` from the output of `cargo locate-project …`",
)?
.root;
let workspace_manifest_content = fs::read_to_string(workspace_manifest) let workspace_manifest = String::try_from(locate_project_output.stdout)
.with_context(|| format!("Failed to read the file {}", workspace_manifest.display()))?; .context("Failed to convert the output of `cargo locate-project …` to a string")?;
let workspace_manifest_content = fs::read_to_string(&workspace_manifest)
.with_context(|| format!("Failed to read the file {workspace_manifest}"))?;
if !workspace_manifest_content.contains("[workspace]") if !workspace_manifest_content.contains("[workspace]")
&& !workspace_manifest_content.contains("workspace.") && !workspace_manifest_content.contains("workspace.")
{ {