chore: Make some of the deps of gpui optional (#16986)

Piotr Osiewicz created

Minor bookkeeping, that takes down dep count of gpui from 454 to 430 for
me.

Release Notes:

- N/A

Change summary

Cargo.lock              |  1 
crates/gpui/Cargo.toml  |  8 ++-
crates/util/Cargo.toml  |  5 +-
crates/util/src/util.rs | 85 ++++++++++++++++++++++--------------------
4 files changed, 53 insertions(+), 46 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -4916,7 +4916,6 @@ dependencies = [
  "sum_tree",
  "taffy",
  "thiserror",
- "time",
  "unicode-segmentation",
  "usvg",
  "util",

crates/gpui/Cargo.toml 🔗

@@ -15,6 +15,7 @@ default = []
 test-support = [
     "backtrace",
     "collections/test-support",
+    "rand",
     "util/test-support",
     "http_client/test-support",
 ]
@@ -36,7 +37,6 @@ bytemuck = { version = "1", optional = true }
 collections.workspace = true
 ctor.workspace = true
 derive_more.workspace = true
-env_logger.workspace = true
 etagere = "0.2"
 futures.workspace = true
 gpui_macros.workspace = true
@@ -50,7 +50,7 @@ parking = "2.0.0"
 parking_lot.workspace = true
 postage.workspace = true
 profiling.workspace = true
-rand.workspace = true
+rand = { optional = true, workspace = true}
 raw-window-handle = "0.6"
 refineable.workspace = true
 resvg = { version = "0.41.0", default-features = false }
@@ -68,7 +68,6 @@ strum.workspace = true
 sum_tree.workspace = true
 taffy = "0.4.3"
 thiserror.workspace = true
-time.workspace = true
 util.workspace = true
 uuid.workspace = true
 waker-fn = "1.2.0"
@@ -76,6 +75,8 @@ waker-fn = "1.2.0"
 [dev-dependencies]
 backtrace = "0.3"
 collections = { workspace = true, features = ["test-support"] }
+env_logger.workspace = true
+rand.workspace = true
 util = { workspace = true, features = ["test-support"] }
 http_client = { workspace = true, features = ["test-support"] }
 unicode-segmentation.workspace = true
@@ -152,6 +153,7 @@ font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "40391b7"
 x11-clipboard = "0.9.2"
 
 [target.'cfg(windows)'.dependencies]
+rand.workspace = true
 windows.workspace = true
 windows-core = "0.58"
 

crates/util/Cargo.toml 🔗

@@ -13,7 +13,7 @@ path = "src/util.rs"
 doctest = true
 
 [features]
-test-support = ["tempfile", "git2"]
+test-support = ["tempfile", "git2", "rand"]
 
 [dependencies]
 anyhow.workspace = true
@@ -23,7 +23,7 @@ futures.workspace = true
 git2 = { workspace = true, optional = true }
 globset.workspace = true
 log.workspace = true
-rand.workspace = true
+rand = {workspace = true, optional = true}
 regex.workspace = true
 rust-embed.workspace = true
 serde.workspace = true
@@ -40,3 +40,4 @@ tendril = "0.4.3"
 [dev-dependencies]
 git2.workspace = true
 tempfile.workspace = true
+rand.workspace = true

crates/util/src/util.rs 🔗

@@ -6,7 +6,7 @@ pub mod serde;
 pub mod test;
 
 use futures::Future;
-use rand::{seq::SliceRandom, Rng};
+
 use regex::Regex;
 use std::sync::OnceLock;
 use std::{
@@ -517,54 +517,59 @@ pub fn defer<F: FnOnce()>(f: F) -> Deferred<F> {
     Deferred(Some(f))
 }
 
-pub struct RandomCharIter<T: Rng> {
-    rng: T,
-    simple_text: bool,
-}
-
-impl<T: Rng> RandomCharIter<T> {
-    pub fn new(rng: T) -> Self {
-        Self {
-            rng,
-            simple_text: std::env::var("SIMPLE_TEXT").map_or(false, |v| !v.is_empty()),
+#[cfg(any(test, feature = "test-support"))]
+mod rng {
+    use rand::{seq::SliceRandom, Rng};
+    pub struct RandomCharIter<T: Rng> {
+        rng: T,
+        simple_text: bool,
+    }
+
+    impl<T: Rng> RandomCharIter<T> {
+        pub fn new(rng: T) -> Self {
+            Self {
+                rng,
+                simple_text: std::env::var("SIMPLE_TEXT").map_or(false, |v| !v.is_empty()),
+            }
         }
-    }
 
-    pub fn with_simple_text(mut self) -> Self {
-        self.simple_text = true;
-        self
+        pub fn with_simple_text(mut self) -> Self {
+            self.simple_text = true;
+            self
+        }
     }
-}
 
-impl<T: Rng> Iterator for RandomCharIter<T> {
-    type Item = char;
+    impl<T: Rng> Iterator for RandomCharIter<T> {
+        type Item = char;
 
-    fn next(&mut self) -> Option<Self::Item> {
-        if self.simple_text {
-            return if self.rng.gen_range(0..100) < 5 {
-                Some('\n')
-            } else {
-                Some(self.rng.gen_range(b'a'..b'z' + 1).into())
-            };
-        }
+        fn next(&mut self) -> Option<Self::Item> {
+            if self.simple_text {
+                return if self.rng.gen_range(0..100) < 5 {
+                    Some('\n')
+                } else {
+                    Some(self.rng.gen_range(b'a'..b'z' + 1).into())
+                };
+            }
 
-        match self.rng.gen_range(0..100) {
-            // whitespace
-            0..=19 => [' ', '\n', '\r', '\t'].choose(&mut self.rng).copied(),
-            // two-byte greek letters
-            20..=32 => char::from_u32(self.rng.gen_range(('α' as u32)..('ω' as u32 + 1))),
-            // // three-byte characters
-            33..=45 => ['✋', '✅', '❌', '❎', '⭐']
-                .choose(&mut self.rng)
-                .copied(),
-            // // four-byte characters
-            46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.rng).copied(),
-            // ascii letters
-            _ => Some(self.rng.gen_range(b'a'..b'z' + 1).into()),
+            match self.rng.gen_range(0..100) {
+                // whitespace
+                0..=19 => [' ', '\n', '\r', '\t'].choose(&mut self.rng).copied(),
+                // two-byte greek letters
+                20..=32 => char::from_u32(self.rng.gen_range(('α' as u32)..('ω' as u32 + 1))),
+                // // three-byte characters
+                33..=45 => ['✋', '✅', '❌', '❎', '⭐']
+                    .choose(&mut self.rng)
+                    .copied(),
+                // // four-byte characters
+                46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.rng).copied(),
+                // ascii letters
+                _ => Some(self.rng.gen_range(b'a'..b'z' + 1).into()),
+            }
         }
     }
 }
-
+#[cfg(any(test, feature = "test-support"))]
+pub use rng::RandomCharIter;
 /// Get an embedded file as a string.
 pub fn asset_str<A: rust_embed::RustEmbed>(path: &str) -> Cow<'static, str> {
     match A::get(path).unwrap().data {