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;
}
}