Store matched encountered property values in map
authorJacob Casper <dev@jacobcasper.com>
Mon, 19 Oct 2020 19:16:20 +0000 (14:16 -0500)
committerJacob Casper <dev@jacobcasper.com>
Mon, 19 Oct 2020 19:16:20 +0000 (14:16 -0500)
This is going to be used to create a value for xsetroot -name
eventually, so that the most recent value encountered from multiple
signals is known.

src/main.rs

index 9380027..fd92244 100644 (file)
@@ -1,9 +1,21 @@
 use dbus::blocking::stdintf::org_freedesktop_dbus::PropertiesPropertiesChanged;
 use dbus::blocking::Connection;
 use dbus::message::Message;
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex};
 use std::time::Duration;
 
+fn update_map(arc_map: Arc<Mutex<HashMap<String, String>>>, key: String, val: String) {
+    let clone_arc = arc_map.clone();
+    let mut map = clone_arc.lock().unwrap();
+    map.insert(key, val.clone());
+    for (k, v) in &*map {
+        println! {"{}: {}", k.clone(), v.clone()};
+    }
+}
+
 fn main() -> Result<(), Box<dyn std::error::Error>> {
+    let arc_locked_xset_map = Arc::new(Mutex::new(HashMap::new()));
     let conn = Connection::new_session()?;
 
     let proxy = conn.with_proxy(
@@ -13,7 +25,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
     );
 
     let _ = proxy.match_signal(
-        |pc: PropertiesPropertiesChanged, _: &Connection, _: &Message| {
+        move |pc: PropertiesPropertiesChanged, _: &Connection, _: &Message| {
             pc.changed_properties["Metadata"]
                 .0
                 .as_iter()
@@ -23,16 +35,27 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
                         let key_str = key.as_str()?;
                         let value = iter.next();
 
+                        let arc_locked_xset_map = Arc::clone(&arc_locked_xset_map);
+
                         match key_str {
                             "xesam:artist" => {
                                 // Variant holding a variant that should just be a Vec<&str> I
                                 // believe. This is _the recommended_ way to do this by the author.
                                 let inner_value = value?.as_iter()?.next()?.as_iter()?.next()?;
                                 let artist = String::from(inner_value.as_str()?);
-                                println!("artist: {}", artist);
+                                update_map(
+                                    arc_locked_xset_map,
+                                    String::from("artist"),
+                                    String::from(artist),
+                                );
                             }
                             "xesam:title" => {
-                                println!("title: {}", value?.as_iter()?.next()?.as_str()?);
+                                let title = value?.as_iter()?.next()?.as_str()?;
+                                update_map(
+                                    arc_locked_xset_map,
+                                    String::from("title"),
+                                    String::from(title),
+                                );
                             }
                             _ => (),
                         }