Move code into the platform

Petros Amoiridis and Joseph T. Lyons created

Co-Authored-By: Joseph T. Lyons <19867440+JosephTLyons@users.noreply.github.com>

Change summary

crates/gpui/src/platform.rs                                  |  1 
crates/gpui/src/platform/mac/platform.rs                     | 31 ++++++
crates/gpui/src/platform/test.rs                             |  4 
crates/recent_projects/src/highlighted_workspace_location.rs | 17 +-
crates/recent_projects/src/recent_projects.rs                |  1 
5 files changed, 44 insertions(+), 10 deletions(-)

Detailed changes

crates/gpui/src/platform.rs 🔗

@@ -68,6 +68,7 @@ pub trait Platform: Send + Sync {
     fn write_to_clipboard(&self, item: ClipboardItem);
     fn read_from_clipboard(&self) -> Option<ClipboardItem>;
     fn open_url(&self, url: &str);
+    fn convert_to_shortened_path(&self, path: &Path) -> PathBuf;
 
     fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()>;
     fn read_credentials(&self, url: &str) -> Result<Option<(String, Vec<u8>)>>;

crates/gpui/src/platform/mac/platform.rs 🔗

@@ -674,6 +674,18 @@ impl platform::Platform for MacPlatform {
         }
     }
 
+    fn convert_to_shortened_path(&self, path: &Path) -> PathBuf {
+        match path.strip_prefix(util::paths::HOME.as_path()) {
+            Ok(relative_path) => {
+                let mut shortened_path = PathBuf::new();
+                shortened_path.push("~");
+                shortened_path.push(relative_path);
+                shortened_path
+            }
+            Err(_) => path.to_path_buf(),
+        }
+    }
+
     fn write_credentials(&self, url: &str, username: &str, password: &[u8]) -> Result<()> {
         let url = CFString::from(url);
         let username = CFString::from(username);
@@ -1113,4 +1125,23 @@ mod tests {
         platform.pasteboard = unsafe { NSPasteboard::pasteboardWithUniqueName(nil) };
         platform
     }
+
+    #[test]
+    fn test_convert_to_shortened_path() {
+        let platform = build_platform();
+
+        let full_path: PathBuf = [
+            util::paths::HOME.to_string_lossy().to_string(),
+            "a".to_string(),
+            "b".to_string(),
+            "c".to_string(),
+        ]
+        .iter()
+        .collect();
+
+        let shortened_path_actual = platform.convert_to_shortened_path(&full_path);
+        let shortened_path_expected = PathBuf::from("~/a/b/c");
+
+        assert_eq!(shortened_path_actual, shortened_path_expected);
+    }
 }

crates/gpui/src/platform/test.rs 🔗

@@ -175,6 +175,10 @@ impl super::Platform for Platform {
 
     fn open_url(&self, _: &str) {}
 
+    fn convert_to_shortened_path(&self, _path: &Path) -> PathBuf {
+        PathBuf::new()
+    }
+
     fn write_credentials(&self, _: &str, _: &str, _: &[u8]) -> Result<()> {
         Ok(())
     }

crates/recent_projects/src/highlighted_workspace_location.rs 🔗

@@ -1,4 +1,4 @@
-use std::path::{Path, PathBuf};
+use std::path::Path;
 
 use fuzzy::StringMatch;
 use gpui::{
@@ -55,20 +55,17 @@ pub struct HighlightedWorkspaceLocation {
 }
 
 impl HighlightedWorkspaceLocation {
-    pub fn new(string_match: &StringMatch, location: &WorkspaceLocation) -> Self {
+    pub fn new(
+        string_match: &StringMatch,
+        location: &WorkspaceLocation,
+        cx: &gpui::AppContext,
+    ) -> Self {
         let mut path_start_offset = 0;
         let (names, paths): (Vec<_>, Vec<_>) = location
             .paths()
             .iter()
             .map(|path| {
-                let mut full_path = PathBuf::new();
-                if path.starts_with(util::paths::HOME.as_path()) {
-                    full_path.push("~");
-                    full_path.push(path.strip_prefix(util::paths::HOME.as_path()).unwrap());
-                } else {
-                    full_path.push(path)
-                }
-
+                let full_path = cx.platform().convert_to_shortened_path(&path);
                 let highlighted_text = Self::highlights_for_path(
                     full_path.as_ref(),
                     &string_match.positions,

crates/recent_projects/src/recent_projects.rs 🔗

@@ -192,6 +192,7 @@ impl PickerDelegate for RecentProjectsView {
         let highlighted_location = HighlightedWorkspaceLocation::new(
             &string_match,
             &self.workspace_locations[string_match.candidate_id],
+            &cx,
         );
 
         Flex::column()