use serde::Serialize; use tokio::sync::watch; pub type NodeID = sodiumoxide::crypto::sign::ed25519::PublicKey; /// Utility function: encodes any serializable value in MessagePack binary format /// using the RMP library. /// /// Field names and variant names are included in the serialization. /// This is used internally by the netapp communication protocol. pub fn rmp_to_vec_all_named(val: &T) -> Result, rmp_serde::encode::Error> where T: Serialize + ?Sized, { let mut wr = Vec::with_capacity(128); let mut se = rmp_serde::Serializer::new(&mut wr) .with_struct_map() .with_string_variants(); val.serialize(&mut se)?; Ok(wr) } /// This async function returns only when a true signal was received /// from a watcher that tells us when to exit. /// Usefull in a select statement to interrupt another /// future: /// ``` /// select!( /// _ = a_long_task() => Success, /// _ = await_exit(must_exit) => Interrupted, /// ) /// ``` pub async fn await_exit(mut must_exit: watch::Receiver) { loop { if must_exit.recv().await == Some(true) { return; } } }