Store matched encountered property values in map
[xsetrootd.git] / src / main.rs
index df3b54e..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,8 +25,43 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
     );
 
     let _ = proxy.match_signal(
-        |pc: PropertiesPropertiesChanged, _: &Connection, _: &Message| {
-            println! {"dumping {:#x?}", pc.changed_properties["Metadata"]};
+        move |pc: PropertiesPropertiesChanged, _: &Connection, _: &Message| {
+            pc.changed_properties["Metadata"]
+                .0
+                .as_iter()
+                .and_then(|mut iter| {
+                    // Iterating over a RefArg goes key, value, key, value... Insane honestly.
+                    while let Some(key) = iter.next() {
+                        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()?);
+                                update_map(
+                                    arc_locked_xset_map,
+                                    String::from("artist"),
+                                    String::from(artist),
+                                );
+                            }
+                            "xesam:title" => {
+                                let title = value?.as_iter()?.next()?.as_str()?;
+                                update_map(
+                                    arc_locked_xset_map,
+                                    String::from("title"),
+                                    String::from(title),
+                                );
+                            }
+                            _ => (),
+                        }
+                    }
+                    Some(())
+                });
             true
         },
     );