use proc_macro2::TokenStream;
use quote::quote;
pub fn generate_cache_read(
name: &syn::Ident,
table_name: &str,
decrypt_results: &TokenStream,
) -> TokenStream {
let redis_cfg = crate::feature_gates::redis();
quote! {
#redis_cfg
let cache_key = if _allow_cache && self.remember_ttl.is_some() {
Some(rullst_orm::query_cache::query_key(
#table_name,
&query_str,
&query_bindings,
)?)
} else {
None
};
#redis_cfg
if let Some(cache_key) = cache_key.as_ref() {
use rullst_orm::_redis::AsyncCommands;
let mut conn = rullst_orm::Orm::redis_manager()?;
if let Ok(cached_data) = conn.get::<_, String>(cache_key).await {
if !cached_data.is_empty() {
if let Ok(mut results) = #name::from_cache_json_array(&cached_data) {
#decrypt_results
return Ok(results);
}
}
}
}
}
}
pub fn generate_cache_write(name: &syn::Ident) -> TokenStream {
let redis_cfg = crate::feature_gates::redis();
quote! {
#redis_cfg
if let (Some(ttl), Some(cache_key)) = (self.remember_ttl, cache_key.as_ref()) {
let ttl = u64::try_from(ttl).map_err(|_| rullst_orm::Error::Validation(
"remember() TTL exceeds the Redis-supported range".to_string()
))?;
if let Ok(serialized) = #name::__rullst_try_cache_json_array(&results) {
let _: Result<(), rullst_orm::Error> =
rullst_orm::query_cache::store_entry(cache_key, &serialized, ttl).await;
}
}
}
}