summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-08-01 11:20:20 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-08-01 11:20:20 -0500
commit1aa216f21d29b0aa92a738d43c572c33799dfef5 (patch)
tree87f839c5af081ac5fa2e1f59d6f2d67f6ac99b4f
parent00bb5d778e66c0481dad6f0d57948b71a0652f49 (diff)
perf: use LazyLock to get colors from env
-rw-r--r--src/listener.rs24
1 files 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<JoinHandle<Result<(), Error>>> = 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<String>,
- cyan: Option<String>,
- yellow: Option<String>,
) -> ControlFlow<Result<(), Error>> {
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(()),
};