let sks = self.keys.iter().map(|x| { x.to_string() }).collect::<Vec<_>>();
let mut msg = sks.join(" ");
I find it a bit ugly in that we construct a temporary Vec just to call join on it. Is there a simpler way to do this (besides running a for loop and manually appending to the string.)
let mut sks = self.keys.iter().fold(String::new(), |a, x| a + x + " ");
let n = sks.len();
if n > 0 { sks.truncate(n - 1); }
// or if you want to show-off
sks.truncate(sks.len().wrapping_sub(1));