From 1aa216f21d29b0aa92a738d43c572c33799dfef5 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Thu, 1 Aug 2024 11:20:20 -0500 Subject: perf: use LazyLock to get colors from env --- src/listener.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/listener.rs b/src/listener.rs index 208c161..6414fb3 100644 --- a/src/listener.rs +++ b/src/listener.rs @@ -1,4 +1,4 @@ -use std::{ops::ControlFlow, time::Duration}; +use std::{ops::ControlFlow, sync::LazyLock, time::Duration}; use tokio::task::JoinHandle; use tokio_stream::StreamExt; @@ -12,6 +12,15 @@ use crate::{ const TICK_RATE: Duration = Duration::from_millis(500); +/// Colors to use for PlaybackStatus +static COLORS: LazyLock<[String; 3]> = LazyLock::new(|| { + [ + std::env::var("BASE16_COLOR_00_HEX").unwrap_or("1d2021".into()), // black + std::env::var("BASE16_COLOR_0C_HEX").unwrap_or("8ec07c".into()), // cyan + std::env::var("BASE16_COLOR_0A_HEX").unwrap_or("fabd2f".into()), // yellow + ] +}); + pub async fn listeners(blocks: Blocks) -> Result<(), Error> { let conn = Connection::session().await?; @@ -20,10 +29,6 @@ pub async fn listeners(blocks: Blocks) -> Result<(), Error> { .build() .await?; - let black = std::env::var("BASE16_COLOR_00_HEX").ok(); - let cyan = std::env::var("BASE16_COLOR_0C_HEX").ok(); - let yellow = std::env::var("BASE16_COLOR_0A_HEX").ok(); - let mut rotator: Option>> = None; let mut old_title = String::new(); @@ -37,7 +42,7 @@ pub async fn listeners(blocks: Blocks) -> Result<(), Error> { tokio::select! { Some(prop) = metadata.next() => handle_metadata(prop, blocks.clone(), &mut old_title, &mut rotator).await, Some(prop) = prev.next() => handle_prev_next(prop, blocks.clone(), '󰒮', "mpris-prev").await, - Some(prop) = play.next() => handle_play(prop, blocks.clone(), black.clone(), cyan.clone(), yellow.clone()).await, + Some(prop) = play.next() => handle_play(prop, blocks.clone()).await, Some(prop) = next.next() => handle_prev_next(prop, blocks.clone(), '󰒭', "mpris-next").await, Some(prop) = volume.next() => handle_volume(prop, blocks.clone()).await, else => { @@ -131,13 +136,10 @@ async fn handle_prev_next( async fn handle_play( prop: PropertyChanged<'_, PlaybackStatus>, blocks: Blocks, - black: Option, - cyan: Option, - yellow: Option, ) -> ControlFlow> { let (icon, color, bg) = match prop.get().await { - Ok(PlaybackStatus::Playing) => ('󰏤', black.clone(), cyan.clone()), - Ok(PlaybackStatus::Paused) => ('󰐊', black.clone(), yellow.clone()), + Ok(PlaybackStatus::Playing) => ('󰏤', Some(COLORS[0].clone()), Some(COLORS[1].clone())), + Ok(PlaybackStatus::Paused) => ('󰐊', Some(COLORS[0].clone()), Some(COLORS[2].clone())), Ok(PlaybackStatus::Stopped) => ('󰐊', None, None), Err(_) => return ControlFlow::Continue(()), }; -- cgit v1.2.3-70-g09d2