#[cfg(feature = "redis")]
use grapple_db::redis::macros::FromRedisValue;
#[cfg(feature = "redis")]
use grapple_db::redis::{AsyncCommands, Client, RedisModel};
#[cfg(feature = "redis")]
use serde::{Deserialize, Serialize};
pub type Result<T> = core::result::Result<T, Error>;
pub type Error = Box<dyn std::error::Error>;
#[cfg(feature = "redis")]
#[derive(Debug, Serialize, Deserialize, FromRedisValue)]
pub struct Model {
a: i32,
b: i32,
}
#[cfg(feature = "redis")]
impl RedisModel for Model {
fn key(&self) -> String {
format!("{}.{}", self.a, self.b)
}
}
#[cfg(feature = "redis")]
impl Model {
pub fn new(value: i32) -> Self {
Self {
a: 2 * value,
b: 3 * value,
}
}
}
#[cfg(feature = "redis")]
#[tokio::main]
async fn main() -> Result<()> {
let client = Client::default().await?;
let model1 = Model::new(1);
let model2 = Model::new(2);
let key1 = model1.key();
let key2 = model2.key();
assert_eq!("OK", client.mset(&[&model1, &model2]).await?);
assert!(!client.mset_nx(&[&model1, &model2]).await?);
assert!(client.exists(&key1).await?);
assert!(client.exists(&key2).await?);
println!("Get models");
let got_models: Vec<Option<Model>> = client.mget(&[&key1, &key2]).await?;
println!("Multiple {:?}", got_models);
let get1: Model = client.get(&key1).await?.unwrap();
println!("Model 1: {:?}", get1);
let get2: Model = client.get(&key2).await?.unwrap();
println!("Model 2: {:?}", get2);
println!();
println!("Del models");
assert_eq!(1, client.del(&key1).await?);
assert_eq!(1, client.del(&key2).await?);
println!();
assert!(!client.exists(&key1).await?);
assert!(!client.exists(&key2).await?);
println!("Get after delete");
let get1: Option<Model> = client.get(&key1).await?;
println!("Model 1: {:?}", get1);
let get2: Option<Model> = client.get(&key2).await?;
println!("Model 2: {:?}", get2);
println!();
client
.connection()
.await?
.client_setname::<_, String>("my_client_name".to_string())
.await?;
println!(
"client getname: {}",
client
.connection()
.await?
.client_getname::<String>()
.await?
);
Ok(())
}
#[cfg(not(feature = "redis"))]
fn main() {
panic!("This example requires 'redis' enabled feature")
}