async-kvdb 0.4.4

A key-value database
Documentation
use super::*;
use prost::Message;

fn decode_proto<T: Message + Default>(key: &Key, data: &[u8]) -> Option<T> {
    match Message::decode(data) {
        Ok(d) => Some(d),
        Err(e) => {
            log::warn!("failed decode_proto {}: {:?}", key, e);
            None
        }
    }
}
fn encode_proto<T: Message>(data: &T) -> Bytes {
    data.encode_to_vec().into()
}

impl<T: ?Sized> KvdbProtoExt for T where T: Kvdb {}

#[async_trait]
pub trait KvdbProtoExt: Kvdb {
    async fn get_proto<T: Message + Default>(&self, key: Key) -> Option<T> {
        let val = self.get(key.clone()).await;
        val.and_then(|v| decode_proto(&key, &v))
    }
    async fn get_many_proto<T: Message + Default>(&self, keys: Vec<Key>) -> HashMap<Key, T> {
        let data = self.get_many(keys).await;
        data.into_iter().filter_map(|(k, v)| decode_proto(&k, &v).map(|v| (k, v))).collect()
    }
    async fn set_proto<T: Message>(&self, key: Key, value: &T) {
        let val = encode_proto(value);
        self.set(key, val).await;
    }
    async fn set_many_proto<T: Message>(&self, data: HashMap<Key, T>) {
        let data = data.into_iter().map(|(k, v)| (k, encode_proto(&v))).collect();
        self.set_many(data).await;
    }
}