From f29b79555d3ad577ee6a965c52dee04c91293445 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Thu, 1 Jan 2026 12:58:02 +0800 Subject: feat: prevent all crashes --- Cargo.lock | 7 +++++++ Cargo.toml | 1 + src/main.rs | 40 +++++++++++++++++----------------------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 788fc19..a6a3ef7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,7 @@ version = "0.1.0" dependencies = [ "clap", "mpris", + "unwrap-retry", ] [[package]] @@ -384,6 +385,12 @@ version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +[[package]] +name = "unwrap-retry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1884fdb570a7bba8d8a68565e16a57682cdb2c6628b86c2c466ec92ff0e4a8d8" + [[package]] name = "utf8parse" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index 7bb881d..aa00c55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2024" [dependencies] clap = { version = "4.5.51", features = ["derive"] } mpris = "2.0.1" +unwrap-retry = "0.3.0" diff --git a/src/main.rs b/src/main.rs index 82ee310..f350b4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use std::{ use clap::Parser; use mpris::{DBusError, FindingError, PlaybackStatus, Player, PlayerFinder}; +use unwrap_retry::{RetryableOptionFn, RetryableResultFn}; const PLAYER_IDENTITY: &str = "Spotify"; const BROWSER_IDENTITY: &str = "Mozilla zen"; @@ -42,19 +43,10 @@ fn get_browser() -> Option { } fn find_player(name: &str) -> Option { - match PlayerFinder::new() + PlayerFinder::new() .expect("Failed to create PlayerFinder") .find_by_name(name) - { - Ok(p) => Some(p), - Err(e) => { - if let FindingError::DBusError(e) = e { - panic!("DBus err: {e}") - } else { - None - } - } - } + .ok() } fn normalize_volume(volume: f64) -> u8 { @@ -67,11 +59,7 @@ fn denormal_volume(volume: u8) -> f64 { fn set_volume(player: &Player, volume: u8) -> Vec> { let mut res = Vec::new(); - let current_volume = normalize_volume( - player - .get_volume() - .unwrap_or_else(|e| panic!("Failed to retrieve {player:#?} volume: {e}")), - ); + let current_volume = normalize_volume((|| player.get_volume()).unwrap_blocking()); if volume == current_volume { return res; @@ -140,15 +128,21 @@ fn daemon() -> ! { } fn set_lower(player: &Player) { - set_volume(player, LOWER_VOLUME) - .into_iter() - .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e}"))); + set_volume( + player, + LOWER_VOLUME, + ) + .into_iter() + .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e} for player {player:#?}"))); } fn set_normal(player: &Player) { - set_volume(player, NORMAL_VOLUME) - .into_iter() - .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e}"))); + set_volume( + player, + NORMAL_VOLUME, + ) + .into_iter() + .for_each(|r| r.unwrap_or_else(|e| eprintln!("Failed to set volume: {e} for player {player:#?}"))); } fn main() { @@ -158,7 +152,7 @@ fn main() { daemon() } - let player = get_player().unwrap_or_else(|| panic!("Player {PLAYER_IDENTITY} not found")); + let player = (|| get_player()).unwrap_blocking(); if args.lower { set_lower(&player); -- cgit v1.2.3