From 55f08c0511c758943c82e6282923ab9581dffb6d Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Thu, 16 May 2024 16:59:57 -0400 Subject: [PATCH] assistant: Update current project context to work with Cargo workspaces (#11935) This PR updates the current project context to work with Cargo workspaces. Release Notes: - N/A --- .../src/ambient_context/current_project.rs | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/crates/assistant/src/ambient_context/current_project.rs b/crates/assistant/src/ambient_context/current_project.rs index d183c7fe255571238776bdb3c6606ebf483ee28f..0f41c4598838335786eb02acdf822f9329c1e57b 100644 --- a/crates/assistant/src/ambient_context/current_project.rs +++ b/crates/assistant/src/ambient_context/current_project.rs @@ -1,3 +1,4 @@ +use std::fmt::Write; use std::path::{Path, PathBuf}; use std::sync::Arc; use std::time::Duration; @@ -92,32 +93,54 @@ impl CurrentProjectContext { let cargo_toml: cargo_toml::Manifest = toml::from_str(&buffer)?; let mut message = String::new(); + writeln!(message, "You are in a Rust project.")?; + + if let Some(workspace) = cargo_toml.workspace { + writeln!( + message, + "The project is a Cargo workspace with the following members:" + )?; + for member in workspace.members { + writeln!(message, "- {member}")?; + } - let name = cargo_toml - .package - .as_ref() - .map(|package| package.name.as_str()); - if let Some(name) = name { - message.push_str(&format!(" named \"{name}\"")); - } - message.push_str(". "); - - let description = cargo_toml - .package - .as_ref() - .and_then(|package| package.description.as_ref()) - .and_then(|description| description.get().ok().cloned()); - if let Some(description) = description.as_ref() { - message.push_str("It describes itself as "); - message.push_str(&format!("\"{description}\"")); - message.push_str(". "); - } + if !workspace.default_members.is_empty() { + writeln!(message, "The default members are:")?; + for member in workspace.default_members { + writeln!(message, "- {member}")?; + } + } - let dependencies = cargo_toml.dependencies.keys().cloned().collect::>(); - if !dependencies.is_empty() { - message.push_str("The following dependencies are installed: "); - message.push_str(&dependencies.join(", ")); - message.push_str(". "); + if !workspace.dependencies.is_empty() { + writeln!( + message, + "The following workspace dependencies are installed:" + )?; + for dependency in workspace.dependencies.keys() { + writeln!(message, "- {dependency}")?; + } + } + } else if let Some(package) = cargo_toml.package { + writeln!( + message, + "The project name is \"{name}\".", + name = package.name + )?; + + let description = package + .description + .as_ref() + .and_then(|description| description.get().ok().cloned()); + if let Some(description) = description.as_ref() { + writeln!(message, "It describes itself as \"{description}\".")?; + } + + if !cargo_toml.dependencies.is_empty() { + writeln!(message, "The following dependencies are installed:")?; + for dependency in cargo_toml.dependencies.keys() { + writeln!(message, "- {dependency}")?; + } + } } Ok(message)