From 28ab70d90d21f9d1b2f9f02ba4f37c5831da863c Mon Sep 17 00:00:00 2001 From: bbb651 Date: Tue, 1 Oct 2024 18:12:14 +0300 Subject: [PATCH 1/7] Upgrade dependencies --- Cargo.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ad97cf..2b71342 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,18 +11,18 @@ build = "build.rs" [dependencies] futures = "0.3.30" -anyhow = "1.0.79" +anyhow = "1.0.89" [dev-dependencies] -tokio = { version = "1.23.0", features = ["full"] } +tokio = { version = "1.40.0", features = ["full"] } [target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] -detect-desktop-environment = "1.0.0" +detect-desktop-environment = "1.1.0" dconf_rs = "0.3" -zbus = "3.0" -rust-ini = "0.20" -ashpd = "0.7.0" -xdg = "2.4.1" +zbus = "4.4" +rust-ini = "0.21" +ashpd = "0.9" +xdg = "2.5" [target.'cfg(windows)'.dependencies] winreg = "0.52.0" From 279210055b59dc1f58c12e73ad5b660570cd5f3a Mon Sep 17 00:00:00 2001 From: bbb651 Date: Tue, 1 Oct 2024 18:21:15 +0300 Subject: [PATCH 2/7] Rename `Mode::Default` to `Mode::NoPreference` This makes more sense to me, especially because on some systems e.g. windows the default was not `Mode::Default` --- README.md | 4 +--- src/freedesktop.rs | 4 ++-- src/lib.rs | 6 +++--- src/platforms/freedesktop/detect.rs | 6 +++--- src/platforms/freedesktop/mod.rs | 5 +++-- src/platforms/freedesktop/notify.rs | 11 +++-------- 6 files changed, 15 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 490561b..10db53a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ fn main() { // Light mode dark_light::Mode::Light => {}, // Unspecified - dark_light::Mode::Default => {}, + dark_light::Mode::NoPreference => {}, } } ``` @@ -35,5 +35,3 @@ Licensed under either of * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. - - diff --git a/src/freedesktop.rs b/src/freedesktop.rs index e40a56b..71faba5 100644 --- a/src/freedesktop.rs +++ b/src/freedesktop.rs @@ -24,7 +24,7 @@ fn get_freedesktop_color_scheme() -> Option { if theme.is_err() { return None; } - + match theme.unwrap() { 1 => Some(Mode::Dark), 2 => Some(Mode::Light), @@ -86,7 +86,7 @@ pub fn detect() -> Mode { DesktopEnvironment::Gnome => detect_gtk("/org/gnome/desktop/interface/gtk-theme"), DesktopEnvironment::Mate => detect_gtk("/org/mate/desktop/interface/gtk-theme"), DesktopEnvironment::Unity => detect_gtk("/org/gnome/desktop/interface/gtk-theme"), - _ => Mode::Default, + _ => Mode::NoPreference, }, } } diff --git a/src/lib.rs b/src/lib.rs index 069faee..5112d26 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ //! // Light mode //! dark_light::Mode::Light => {}, //! // Unspecified -//! dark_light::Mode::Default => {}, +//! dark_light::Mode::NoPreference => {}, //! } //! ``` @@ -36,7 +36,7 @@ pub enum Mode { /// Light mode Light, /// Unspecified - Default, + NoPreference, } impl Mode { @@ -67,7 +67,7 @@ impl Mode { } } -/// Detect if light mode or dark mode is enabled. If the mode can’t be detected, fall back to [`Mode::Default`]. +/// Detect if light mode or dark mode is enabled. If the mode can’t be detected, fall back to [`Mode::NoPreference`]. pub use platform::detect::detect; /// Notifies the user if the system theme has been changed. pub use platform::notify::subscribe; diff --git a/src/platforms/freedesktop/detect.rs b/src/platforms/freedesktop/detect.rs index 738acff..e663dce 100644 --- a/src/platforms/freedesktop/detect.rs +++ b/src/platforms/freedesktop/detect.rs @@ -33,15 +33,15 @@ impl ColorScheme for NonFreeDesktop { Some(mode) => match mode { DesktopEnvironment::Kde => match kde_detect() { Ok(mode) => mode, - Err(_) => Mode::Default, + Err(_) => Mode::NoPreference, }, DesktopEnvironment::Cinnamon => dconf_detect(CINNAMON), DesktopEnvironment::Gnome => dconf_detect(GNOME), DesktopEnvironment::Mate => dconf_detect(MATE), DesktopEnvironment::Unity => dconf_detect(GNOME), - _ => Mode::Default, + _ => Mode::NoPreference, }, - None => Mode::Default, + None => Mode::NoPreference, } } } diff --git a/src/platforms/freedesktop/mod.rs b/src/platforms/freedesktop/mod.rs index cd65e05..1803737 100644 --- a/src/platforms/freedesktop/mod.rs +++ b/src/platforms/freedesktop/mod.rs @@ -21,7 +21,7 @@ fn dconf_detect(path: &str) -> Mode { Mode::Light } } - Err(_) => Mode::Default, + Err(_) => Mode::NoPreference, } } @@ -41,10 +41,11 @@ fn kde_detect() -> anyhow::Result { Ok(Mode::from_rgb(rgb)) } +#[cfg(feature = "zbus")] impl From for Mode { fn from(value: ashpd::desktop::settings::ColorScheme) -> Self { match value { - ashpd::desktop::settings::ColorScheme::NoPreference => Mode::Default, + ashpd::desktop::settings::ColorScheme::NoPreference => Mode::NoPreference, ashpd::desktop::settings::ColorScheme::PreferDark => Mode::Dark, ashpd::desktop::settings::ColorScheme::PreferLight => Mode::Light, } diff --git a/src/platforms/freedesktop/notify.rs b/src/platforms/freedesktop/notify.rs index c63fdc1..fe1f661 100644 --- a/src/platforms/freedesktop/notify.rs +++ b/src/platforms/freedesktop/notify.rs @@ -1,4 +1,3 @@ -use ashpd::desktop::settings::{ColorScheme, Settings}; use futures::{stream, Stream, StreamExt}; use std::task::Poll; @@ -6,7 +5,7 @@ use crate::{detect, Mode}; pub async fn subscribe() -> anyhow::Result + Send> { let stream = if get_freedesktop_color_scheme().await.is_ok() { - let proxy = Settings::new().await?; + let proxy = ashpd::desktop::Settings::new().await?; proxy .receive_color_scheme_changed() .await? @@ -31,12 +30,8 @@ pub async fn subscribe() -> anyhow::Result + Send> { } async fn get_freedesktop_color_scheme() -> anyhow::Result { - let proxy = Settings::new().await?; + let proxy = ashpd::desktop::Settings::new().await?; let color_scheme = proxy.color_scheme().await?; - let mode = match color_scheme { - ColorScheme::PreferDark => Mode::Dark, - ColorScheme::PreferLight => Mode::Light, - ColorScheme::NoPreference => Mode::Default, - }; + let mode = color_scheme.into(); Ok(mode) } From b87981547bc242d4cda744619f49b51721849825 Mon Sep 17 00:00:00 2001 From: bbb651 Date: Tue, 1 Oct 2024 18:26:10 +0300 Subject: [PATCH 3/7] Return `Mode::NoPreference` for unsupported platforms --- src/platforms/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platforms/mod.rs b/src/platforms/mod.rs index 35037de..6a518e8 100644 --- a/src/platforms/mod.rs +++ b/src/platforms/mod.rs @@ -43,6 +43,6 @@ pub use websys as platform; )))] pub mod platform { pub fn detect() -> crate::Mode { - super::Mode::Light + super::Mode::NoPreference } } From 651acc6e68703f0d4527a0f510493ed53d6697c1 Mon Sep 17 00:00:00 2001 From: bbb651 Date: Wed, 2 Oct 2024 13:38:05 +0300 Subject: [PATCH 4/7] example(notify): Don't resubscribe on every iteration --- examples/notify.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/notify.rs b/examples/notify.rs index 3efa3d5..6ade504 100644 --- a/examples/notify.rs +++ b/examples/notify.rs @@ -2,7 +2,8 @@ use futures::StreamExt; #[tokio::main] async fn main() -> anyhow::Result<()> { - while let Some(mode) = dark_light::subscribe().await?.next().await { + let mut stream = dark_light::subscribe().await?; + while let Some(mode) = stream.next().await { println!("System theme changed: {:?}", mode); } From d879a3fcbbfb74208e829c017400e712e9f24adf Mon Sep 17 00:00:00 2001 From: bbb651 Date: Wed, 2 Oct 2024 15:47:08 +0300 Subject: [PATCH 5/7] Make `zbus` optional --- Cargo.toml | 7 +++-- README.md | 3 ++ src/lib.rs | 8 +++++ src/platforms/freedesktop/detect.rs | 33 ++++++++++++++++++++- src/platforms/freedesktop/notify.rs | 46 +++++++++++++++++++++++++---- 5 files changed, 89 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2b71342..5666ed4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,9 +19,9 @@ tokio = { version = "1.40.0", features = ["full"] } [target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dependencies] detect-desktop-environment = "1.1.0" dconf_rs = "0.3" -zbus = "4.4" +zbus = { version = "4.4", optional = true } +ashpd = { version = "0.9", optional = true } rust-ini = "0.21" -ashpd = "0.9" xdg = "2.5" [target.'cfg(windows)'.dependencies] @@ -32,3 +32,6 @@ objc = "0.2" [target.'cfg(target_arch = "wasm32")'.dependencies] web-sys = { version = "0.3", features = ["MediaQueryList", "Window"] } + +[features] +zbus = ["dep:zbus", "dep:ashpd"] diff --git a/README.md b/README.md index 10db53a..cc6e45c 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ fn main() { } ``` +On platforms which make use of xdg-desktop-portals, by default this crate uses the `dbus-send` and `dbus-monitor` commands to avoid heavy dependencies. +If you already depend on `zbus` or `ashpd`, you should enable the `zbus` feature. + ## Example ``` diff --git a/src/lib.rs b/src/lib.rs index 5112d26..a2661f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,6 +65,14 @@ impl Mode { Self::Light } } + + fn concrete(self) -> Option { + match self { + Mode::Dark => Some(Mode::Dark), + Mode::Light => Some(Mode::Light), + Mode::NoPreference => None, + } + } } /// Detect if light mode or dark mode is enabled. If the mode can’t be detected, fall back to [`Mode::NoPreference`]. diff --git a/src/platforms/freedesktop/detect.rs b/src/platforms/freedesktop/detect.rs index e663dce..26c361f 100644 --- a/src/platforms/freedesktop/detect.rs +++ b/src/platforms/freedesktop/detect.rs @@ -1,3 +1,5 @@ +use std::process::Command; + use detect_desktop_environment::DesktopEnvironment; use crate::Mode; @@ -6,6 +8,8 @@ use super::{dconf_detect, kde_detect, CINNAMON, GNOME, MATE}; pub fn detect() -> Mode { NonFreeDesktop::detect() + .concrete() + .unwrap_or_else(FreeDesktop::detect) } /// Detects the color scheme on a platform. @@ -22,7 +26,34 @@ struct NonFreeDesktop; /// Detects the color scheme on FreeDesktop platforms. It makes use of the DBus interface. impl ColorScheme for FreeDesktop { fn detect() -> Mode { - todo!() + let Ok(output) = Command::new("dbus-send") + .args([ + "--print-reply=literal", + "--dest=org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings.Read", + "string:org.freedesktop.appearance", + "string:color-scheme", + ]) + .output() + .map(|output| output.stdout) + else { + return Mode::NoPreference; + }; + const PREFIX: &[u8] = b"uint32 "; + if let Some(index) = output + .windows(PREFIX.len()) + .position(|bytes| bytes == PREFIX) + { + match output.get(index + PREFIX.len()) { + Some(b'0') => Mode::NoPreference, + Some(b'1') => Mode::Dark, + Some(b'2') => Mode::Light, + _ => Mode::NoPreference, + } + } else { + Mode::NoPreference + } } } diff --git a/src/platforms/freedesktop/notify.rs b/src/platforms/freedesktop/notify.rs index fe1f661..119d907 100644 --- a/src/platforms/freedesktop/notify.rs +++ b/src/platforms/freedesktop/notify.rs @@ -1,11 +1,46 @@ -use futures::{stream, Stream, StreamExt}; -use std::task::Poll; +use crate::Mode; +use futures::Stream; -use crate::{detect, Mode}; +#[cfg(not(feature = "zbus"))] +pub async fn subscribe() -> anyhow::Result + Send> { + use futures::stream; + use std::{ + io::{BufRead, BufReader}, + process::{Command, Stdio}, + }; + let mut process = Command::new("dbus-monitor") + .arg( + "type='signal',\ + sender='org.freedesktop.portal.Desktop',\ + path='/org/freedesktop/portal/desktop',\ + interface='org.freedesktop.portal.Settings',\ + member='SettingChanged',\ + arg0='org.freedesktop.appearance',\ + arg1='color-scheme'", + ) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .spawn() + .unwrap(); + let stdout = process.stdout.take().unwrap(); + let lines = BufReader::new(stdout).lines(); + Ok(stream::iter(lines.filter_map( + |line| match line.ok()?.chars().last()? { + '0' => Some(Mode::NoPreference), + '1' => Some(Mode::Dark), + '2' => Some(Mode::Light), + _ => None, + }, + ))) +} +#[cfg(feature = "zbus")] pub async fn subscribe() -> anyhow::Result + Send> { + use crate::detect; + use futures::{stream, StreamExt}; + use std::task::Poll; let stream = if get_freedesktop_color_scheme().await.is_ok() { - let proxy = ashpd::desktop::Settings::new().await?; + let proxy = ashpd::desktop::settings::Settings::new().await?; proxy .receive_color_scheme_changed() .await? @@ -29,8 +64,9 @@ pub async fn subscribe() -> anyhow::Result + Send> { Ok(stream) } +#[cfg(feature = "zbus")] async fn get_freedesktop_color_scheme() -> anyhow::Result { - let proxy = ashpd::desktop::Settings::new().await?; + let proxy = ashpd::desktop::settings::Settings::new().await?; let color_scheme = proxy.color_scheme().await?; let mode = color_scheme.into(); Ok(mode) From 66543d26de1b5f78d193038e9cf7c8f7401c853e Mon Sep 17 00:00:00 2001 From: bbb651 Date: Wed, 2 Oct 2024 16:03:45 +0300 Subject: [PATCH 6/7] Remove dependency on `anyhow` There's still no proper error type, I replaced some of them with `Box` instead, but at least we don't have the dependency anymore. --- Cargo.toml | 1 - examples/notify.rs | 4 +++- src/lib.rs | 4 +++- src/platforms/freedesktop/detect.rs | 5 +---- src/platforms/freedesktop/mod.rs | 26 +++++++++++--------------- src/platforms/freedesktop/notify.rs | 10 +++++----- src/platforms/macos/notify.rs | 3 ++- src/platforms/websys/notify.rs | 3 ++- src/platforms/windows/notify.rs | 3 ++- src/utils/rgb.rs | 6 ++++-- 10 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5666ed4..e44fcdf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ build = "build.rs" [dependencies] futures = "0.3.30" -anyhow = "1.0.89" [dev-dependencies] tokio = { version = "1.40.0", features = ["full"] } diff --git a/examples/notify.rs b/examples/notify.rs index 6ade504..fcf8bb5 100644 --- a/examples/notify.rs +++ b/examples/notify.rs @@ -1,7 +1,9 @@ +use std::error::Error; + use futures::StreamExt; #[tokio::main] -async fn main() -> anyhow::Result<()> { +async fn main() -> Result<(), Box> { let mut stream = dark_light::subscribe().await?; while let Some(mode) = stream.next().await { println!("System theme changed: {:?}", mode); diff --git a/src/lib.rs b/src/lib.rs index a2661f5..633ff2a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,6 +16,7 @@ //! ``` mod platforms; + use platforms::platform; mod utils; @@ -29,13 +30,14 @@ mod utils; use utils::rgb::Rgb; /// Enum representing dark mode, light mode, or unspecified. -#[derive(Copy, Clone, PartialEq, Eq, Debug)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] pub enum Mode { /// Dark mode Dark, /// Light mode Light, /// Unspecified + #[default] NoPreference, } diff --git a/src/platforms/freedesktop/detect.rs b/src/platforms/freedesktop/detect.rs index 26c361f..40f69b7 100644 --- a/src/platforms/freedesktop/detect.rs +++ b/src/platforms/freedesktop/detect.rs @@ -62,10 +62,7 @@ impl ColorScheme for NonFreeDesktop { fn detect() -> Mode { match DesktopEnvironment::detect() { Some(mode) => match mode { - DesktopEnvironment::Kde => match kde_detect() { - Ok(mode) => mode, - Err(_) => Mode::NoPreference, - }, + DesktopEnvironment::Kde => kde_detect(), DesktopEnvironment::Cinnamon => dconf_detect(CINNAMON), DesktopEnvironment::Gnome => dconf_detect(GNOME), DesktopEnvironment::Mate => dconf_detect(MATE), diff --git a/src/platforms/freedesktop/mod.rs b/src/platforms/freedesktop/mod.rs index 1803737..6911c19 100644 --- a/src/platforms/freedesktop/mod.rs +++ b/src/platforms/freedesktop/mod.rs @@ -1,6 +1,5 @@ use std::str::FromStr; -use anyhow::Context; use ini::Ini; use crate::{utils::rgb::Rgb, Mode}; @@ -25,20 +24,17 @@ fn dconf_detect(path: &str) -> Mode { } } -fn kde_detect() -> anyhow::Result { - let xdg = xdg::BaseDirectories::new()?; - let path = xdg - .find_config_file("kdeglobals") - .context("Path not found")?; - let cfg = Ini::load_from_file(path)?; - let properties = cfg - .section(Some("Colors:Window")) - .context("Failed to get section Colors:Window")?; - let background = properties - .get("BackgroundNormal") - .context("Failed to get BackgroundNormal inside Colors:Window")?; - let rgb = Rgb::from_str(background).unwrap(); - Ok(Mode::from_rgb(rgb)) +fn kde_detect() -> Mode { + fn kde_detect() -> Option { + let xdg = xdg::BaseDirectories::new().ok()?; + let path = xdg.find_config_file("kdeglobals")?; + let cfg = Ini::load_from_file(path).ok()?; + let properties = cfg.section(Some("Colors:Window"))?; + let background = properties.get("BackgroundNormal")?; + let rgb = Rgb::from_str(background).ok()?; + Some(Mode::from_rgb(rgb)) + } + kde_detect().unwrap_or_default() } #[cfg(feature = "zbus")] diff --git a/src/platforms/freedesktop/notify.rs b/src/platforms/freedesktop/notify.rs index 119d907..b097a77 100644 --- a/src/platforms/freedesktop/notify.rs +++ b/src/platforms/freedesktop/notify.rs @@ -1,8 +1,9 @@ use crate::Mode; use futures::Stream; +use std::error::Error; #[cfg(not(feature = "zbus"))] -pub async fn subscribe() -> anyhow::Result + Send> { +pub async fn subscribe() -> Result + Send, Box> { use futures::stream; use std::{ io::{BufRead, BufReader}, @@ -20,8 +21,7 @@ pub async fn subscribe() -> anyhow::Result + Send> { ) .stdout(Stdio::piped()) .stderr(Stdio::null()) - .spawn() - .unwrap(); + .spawn()?; let stdout = process.stdout.take().unwrap(); let lines = BufReader::new(stdout).lines(); Ok(stream::iter(lines.filter_map( @@ -35,7 +35,7 @@ pub async fn subscribe() -> anyhow::Result + Send> { } #[cfg(feature = "zbus")] -pub async fn subscribe() -> anyhow::Result + Send> { +pub async fn subscribe() -> Result + Send, Box> { use crate::detect; use futures::{stream, StreamExt}; use std::task::Poll; @@ -65,7 +65,7 @@ pub async fn subscribe() -> anyhow::Result + Send> { } #[cfg(feature = "zbus")] -async fn get_freedesktop_color_scheme() -> anyhow::Result { +async fn get_freedesktop_color_scheme() -> Result> { let proxy = ashpd::desktop::settings::Settings::new().await?; let color_scheme = proxy.color_scheme().await?; let mode = color_scheme.into(); diff --git a/src/platforms/macos/notify.rs b/src/platforms/macos/notify.rs index 305205f..8c3608c 100644 --- a/src/platforms/macos/notify.rs +++ b/src/platforms/macos/notify.rs @@ -1,10 +1,11 @@ +use std::error::Error; use std::task::Poll; use futures::{stream, Stream}; use crate::{detect, Mode}; -pub async fn subscribe() -> anyhow::Result + Send> { +pub async fn subscribe() -> Result + Send, Box> { let mut last_mode = detect(); let stream = stream::poll_fn(move |ctx| -> Poll> { diff --git a/src/platforms/websys/notify.rs b/src/platforms/websys/notify.rs index 305205f..8c3608c 100644 --- a/src/platforms/websys/notify.rs +++ b/src/platforms/websys/notify.rs @@ -1,10 +1,11 @@ +use std::error::Error; use std::task::Poll; use futures::{stream, Stream}; use crate::{detect, Mode}; -pub async fn subscribe() -> anyhow::Result + Send> { +pub async fn subscribe() -> Result + Send, Box> { let mut last_mode = detect(); let stream = stream::poll_fn(move |ctx| -> Poll> { diff --git a/src/platforms/windows/notify.rs b/src/platforms/windows/notify.rs index 22a91fd..7a3621a 100644 --- a/src/platforms/windows/notify.rs +++ b/src/platforms/windows/notify.rs @@ -1,10 +1,11 @@ +use std::error::Error; use std::task::Poll; use futures::{stream, Stream}; use crate::{detect, Mode}; -pub async fn subscribe() -> anyhow::Result + Send> { +pub async fn subscribe() -> Result + Send, Box> { let mut last_mode = detect(); let stream = stream::poll_fn(move |ctx| -> Poll> { diff --git a/src/utils/rgb.rs b/src/utils/rgb.rs index d43f62b..43798a8 100644 --- a/src/utils/rgb.rs +++ b/src/utils/rgb.rs @@ -3,8 +3,10 @@ use std::str::FromStr; /// Struct representing an RGB color pub(crate) struct Rgb(pub(crate) u32, pub(crate) u32, pub(crate) u32); +pub struct ParseError; + impl FromStr for Rgb { - type Err = anyhow::Error; + type Err = ParseError; fn from_str(s: &str) -> Result { let rgb = s @@ -15,7 +17,7 @@ impl FromStr for Rgb { acc.push(x); Ok(acc) } else { - Err(anyhow::anyhow!("RGB format is invalid")) + Err(ParseError) } })?; Ok(Rgb(rgb[0], rgb[1], rgb[2])) From 192daa06be5a0bad927e71c05a1e2eb5d9061c54 Mon Sep 17 00:00:00 2001 From: bbb651 Date: Wed, 2 Oct 2024 17:10:27 +0300 Subject: [PATCH 7/7] Remove patch version for `futures` It's not necessary and very easily conflicts --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e44fcdf..381c1f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ readme = "README.md" build = "build.rs" [dependencies] -futures = "0.3.30" +futures = "0.3" [dev-dependencies] tokio = { version = "1.40.0", features = ["full"] }