assistant: Remove `unwrap`s in `RecentBuffersContext` (#11938)

Marshall Bowers created

This PR removes the `unwrap`s in the `RecentBuffersContext` when
building the message.

We can just make `build_message` return a `Result` to clean things up.

Release Notes:

- N/A

Change summary

crates/assistant/src/ambient_context/recent_buffers.rs | 70 ++++++------
1 file changed, 35 insertions(+), 35 deletions(-)

Detailed changes

crates/assistant/src/ambient_context/recent_buffers.rs 🔗

@@ -3,8 +3,10 @@ use std::iter;
 use std::path::PathBuf;
 use std::time::Duration;
 
+use anyhow::Result;
 use gpui::{ModelContext, Subscription, Task, WeakModel};
 use language::{Buffer, BufferSnapshot, DiagnosticEntry, Point};
+use util::ResultExt;
 
 use crate::ambient_context::ContextUpdated;
 use crate::assistant_panel::Conversation;
@@ -69,61 +71,60 @@ impl RecentBuffersContext {
                 const DEBOUNCE_TIMEOUT: Duration = Duration::from_millis(100);
                 cx.background_executor().timer(DEBOUNCE_TIMEOUT).await;
 
-                let message = cx
+                let message_task = cx
                     .background_executor()
-                    .spawn(async move { Self::build_message(&buffers) })
-                    .await;
-                this.update(&mut cx, |conversation, cx| {
-                    conversation.ambient_context.recent_buffers.message = message;
-                    conversation.count_remaining_tokens(cx);
-                    cx.notify();
-                })
-                .ok();
+                    .spawn(async move { Self::build_message(&buffers) });
+
+                if let Some(message) = message_task.await.log_err() {
+                    this.update(&mut cx, |conversation, cx| {
+                        conversation.ambient_context.recent_buffers.message = message;
+                        conversation.count_remaining_tokens(cx);
+                        cx.notify();
+                    })
+                    .log_err();
+                }
             }));
 
             ContextUpdated::Updating
         }
     }
 
-    fn build_message(buffers: &[(Option<PathBuf>, BufferSnapshot)]) -> String {
+    fn build_message(buffers: &[(Option<PathBuf>, BufferSnapshot)]) -> Result<String> {
         let mut message = String::new();
         writeln!(
             message,
             "The following is a list of recent buffers that the user has opened."
-        )
-        .unwrap();
+        )?;
         writeln!(
             message,
             "For every line in the buffer, I will include a row number that line corresponds to."
-        )
-        .unwrap();
+        )?;
         writeln!(
             message,
             "Lines that don't have a number correspond to errors and warnings. For example:"
-        )
-        .unwrap();
-        writeln!(message, "path/to/file.md").unwrap();
-        writeln!(message, "```markdown").unwrap();
-        writeln!(message, "1 The quick brown fox").unwrap();
-        writeln!(message, "2 jumps over one active").unwrap();
-        writeln!(message, "             --- error: should be 'the'").unwrap();
-        writeln!(message, "                 ------ error: should be 'lazy'").unwrap();
-        writeln!(message, "3 dog").unwrap();
-        writeln!(message, "```").unwrap();
+        )?;
+        writeln!(message, "path/to/file.md")?;
+        writeln!(message, "```markdown")?;
+        writeln!(message, "1 The quick brown fox")?;
+        writeln!(message, "2 jumps over one active")?;
+        writeln!(message, "             --- error: should be 'the'")?;
+        writeln!(message, "                 ------ error: should be 'lazy'")?;
+        writeln!(message, "3 dog")?;
+        writeln!(message, "```")?;
 
         message.push('\n');
-        writeln!(message, "Here's the actual recent buffer list:").unwrap();
+        writeln!(message, "Here's the actual recent buffer list:")?;
         for (path, buffer) in buffers {
             if let Some(path) = path {
-                writeln!(message, "{}", path.display()).unwrap();
+                writeln!(message, "{}", path.display())?;
             } else {
-                writeln!(message, "untitled").unwrap();
+                writeln!(message, "untitled")?;
             }
 
             if let Some(language) = buffer.language() {
-                writeln!(message, "```{}", language.name().to_lowercase()).unwrap();
+                writeln!(message, "```{}", language.name().to_lowercase())?;
             } else {
-                writeln!(message, "```").unwrap();
+                writeln!(message, "```")?;
             }
 
             let mut diagnostics = buffer
@@ -149,7 +150,7 @@ impl RecentBuffersContext {
                 }
 
                 let row_width = (display_row as f32).log10() as usize + 1;
-                write!(message, "{}", display_row).unwrap();
+                write!(message, "{}", display_row)?;
                 if row_width < gutter_width {
                     message.extend(iter::repeat(' ').take(gutter_width - row_width));
                 }
@@ -178,7 +179,7 @@ impl RecentBuffersContext {
                     };
 
                     message.extend(iter::repeat('-').take((end_column - start_column) as usize));
-                    writeln!(message, " {}", diagnostic.diagnostic.message).unwrap();
+                    writeln!(message, " {}", diagnostic.diagnostic.message)?;
                 }
             }
 
@@ -188,14 +189,13 @@ impl RecentBuffersContext {
         writeln!(
             message,
             "When quoting the above code, mention which rows the code occurs at."
-        )
-        .unwrap();
+        )?;
         writeln!(
             message,
             "Never include rows in the quoted code itself and only report lines that didn't start with a row number."
         )
-        .unwrap();
+        ?;
 
-        message
+        Ok(message)
     }
 }