From 4355f90ae999e6f936ee713de5cbbdce2a9f38d8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 4 Jul 2025 15:27:35 -0700 Subject: [PATCH] screenreader: Clean up code, memory allocations a bit --- src/manager/user.rs | 12 +++------ src/screenreader.rs | 59 ++++++++++++++++++++++++--------------------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/manager/user.rs b/src/manager/user.rs index 41557d6..980c2d3 100644 --- a/src/manager/user.rs +++ b/src/manager/user.rs @@ -308,11 +308,7 @@ impl CpuScaling1 { let governors = get_available_cpu_scaling_governors() .await .map_err(to_zbus_fdo_error)?; - let mut result = Vec::new(); - for g in governors { - result.push(g.to_string()); - } - Ok(result) + Ok(governors.into_iter().map(|g| g.to_string()).collect()) } #[zbus(property)] @@ -712,7 +708,7 @@ impl ScreenReader0 { } #[zbus(property)] - async fn voice(&self) -> String { + async fn voice(&self) -> &str { self.screen_reader.voice() } @@ -730,13 +726,13 @@ impl ScreenReader0 { } #[zbus(property)] - async fn voice_locales(&self) -> Vec { + async fn voice_locales(&self) -> Vec<&str> { self.screen_reader.get_voice_locales() } #[zbus(property)] async fn voices_for_locale(&self) -> HashMap> { - self.screen_reader.get_voices() + self.screen_reader.get_voices().clone() } async fn trigger_action(&mut self, a: u32, timestamp: u64) -> fdo::Result<()> { diff --git a/src/screenreader.rs b/src/screenreader.rs index cc828a8..c8b9965 100644 --- a/src/screenreader.rs +++ b/src/screenreader.rs @@ -109,6 +109,10 @@ pub(crate) struct OrcaManager<'dbus> { voices_by_language: HashMap>, } +fn default_map() -> Value { + Value::Object(Map::new()) +} + impl<'dbus> OrcaManager<'dbus> { pub async fn new(connection: &Connection) -> Result> { let mut manager = OrcaManager { @@ -146,7 +150,7 @@ impl<'dbus> OrcaManager<'dbus> { match manager.init_voice_list() { Ok(()) => trace!("Voice list loaded"), - Err(e) => error!("Unable to init voice list. {e}"), + Err(e) => error!("Unable to init voice list: {e}"), } Ok(manager) @@ -161,22 +165,20 @@ impl<'dbus> OrcaManager<'dbus> { .name; let connection = SDConnection::open(CLIENT_NAME, CONNECTION_NAME, &user_name, Mode::Threaded)?; - let voices = connection.list_synthesis_voices()?.to_vec(); - for v in voices.iter() { - let name = &v.name; - let lang = &v.language; - self.voices.insert(name.clone(), v.clone()); + let voices = connection.list_synthesis_voices()?; + for v in voices.into_iter() { self.voices_by_language - .entry(lang.clone()) + .entry(v.language.clone()) .or_default() - .push(name.clone()); + .push(v.name.clone()); + self.voices.insert(v.name.clone(), v); } Ok(()) } - pub fn get_voices(&self) -> HashMap> { - self.voices_by_language.clone() + pub fn get_voices(&self) -> &HashMap> { + &self.voices_by_language } #[cfg(test)] @@ -194,8 +196,8 @@ impl<'dbus> OrcaManager<'dbus> { Ok(()) } - pub fn get_voice_locales(&self) -> Vec { - self.voices_by_language.keys().cloned().collect() + pub fn get_voice_locales(&self) -> Vec<&str> { + self.voices_by_language.keys().map(String::as_str).collect() } #[cfg(not(test))] @@ -241,8 +243,8 @@ impl<'dbus> OrcaManager<'dbus> { Ok(()) } - pub fn voice(&self) -> String { - self.voice.clone() + pub fn voice(&self) -> &str { + self.voice.as_str() } pub async fn set_voice(&mut self, voice: &str) -> Result<()> { @@ -423,7 +425,7 @@ impl<'dbus> OrcaManager<'dbus> { .as_object_mut() .ok_or(anyhow!("orca user-settings.conf json is not an object"))? .entry("general") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); general .as_object_mut() .ok_or(anyhow!("orca user-settings.conf general is not an object"))? @@ -511,35 +513,38 @@ impl<'dbus> OrcaManager<'dbus> { .as_object_mut() .ok_or(anyhow!("orca user-settings.conf json is not an object"))? .entry("profiles") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let default_profile = profiles .as_object_mut() .ok_or(anyhow!("orca user-settings.conf profiles is not an object"))? .entry("default") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let voices = default_profile .as_object_mut() .ok_or(anyhow!( "orca user-settings.conf default profile is not an object" ))? .entry("voices") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let default_voice = voices .as_object_mut() .ok_or(anyhow!("orca user-settings.conf voices is not an object"))? .entry("default") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let family = default_voice .as_object_mut() .ok_or(anyhow!("orca user-settings.conf family is not an object"))? .entry("family") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); // If we have a dialect use it, otherwise leave it blank - let mut language = voice.language.clone(); - let mut dialect = ""; + let language; + let dialect; if let Some((l, d)) = voice.language.split_once("-") { - language = l.to_string(); + language = l; dialect = d; + } else { + language = voice.language.as_str(); + dialect = ""; } let mut_family = family.as_object_mut().ok_or(anyhow!( "orca user-settings.conf default voice family is not an object" @@ -580,24 +585,24 @@ impl<'dbus> OrcaManager<'dbus> { .as_object_mut() .ok_or(anyhow!("orca user-settings.conf json is not an object"))? .entry("profiles") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let default_profile = profiles .as_object_mut() .ok_or(anyhow!("orca user-settings.conf profiles is not an object"))? .entry("default") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let voices = default_profile .as_object_mut() .ok_or(anyhow!( "orca user-settings.conf default profile is not an object" ))? .entry("voices") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); let default_voice = voices .as_object_mut() .ok_or(anyhow!("orca user-settings.conf voices is not an object"))? .entry("default") - .or_insert(Value::Object(Map::new())); + .or_insert_with(default_map); default_voice .as_object_mut() .ok_or(anyhow!(