async-kvdb 0.4.4

A key-value database
Documentation
use super::*;
use serde::{Deserialize, Serialize};

fn decode_json<T: for<'a> Deserialize<'a>>(key: &Key, data: &[u8]) -> Option<T> {
    match serde_json::from_slice(data) {
        Ok(d) => Some(d),
        Err(e) => {
            log::warn!("failed decode_json {}: {:?}", key, e);
            None
        }
    }
}
fn encode_json<T: Serialize>(data: &T) -> Bytes {
    serde_json::to_vec_pretty(data).unwrap_or_default().into()
}

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

#[async_trait]
pub trait KvdbJsonExt: Kvdb {
    async fn get_json<T: for<'a> Deserialize<'a>>(&self, key: Key) -> Option<T> {
        let val = self.get(key.clone()).await;
        val.and_then(|v| decode_json(&key, &v))
    }
    async fn get_many_json<T: for<'a> Deserialize<'a>>(&self, keys: Vec<Key>) -> HashMap<Key, T> {
        let data = self.get_many(keys).await;
        data.into_iter().filter_map(|(k, v)| decode_json(&k, &v).map(|v| (k, v))).collect()
    }
    async fn set_json<T: Serialize + Send + Sync>(&self, key: Key, value: &T) {
        let val = encode_json(value);
        self.set(key, val).await;
    }
    async fn set_many_json<T: Serialize + Send + Sync>(&self, data: HashMap<Key, T>) {
        let data = data.into_iter().map(|(k, v)| (k, encode_json(&v))).collect();
        self.set_many(data).await;
    }
}