derive_redis_swapplex/
lib.rs

1use quote::quote;
2use syn::{parse_macro_input, DeriveInput};
3
4#[proc_macro_derive(ConnectionManagerContext)]
5pub fn derive_manager_context(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
6  let input = parse_macro_input!(input as DeriveInput);
7  let ident = &input.ident;
8
9  let expanded = quote! {
10    impl redis_swapplex::ConnectionManagerContext for #ident {
11      type ConnectionInfo = redis_swapplex::RedisDB<#ident>;
12      fn connection_manager() -> &'static redis_swapplex::ConnectionManager<redis_swapplex::RedisDB<#ident>> {
13        static CONNECTION_MANAGER: redis_swapplex::ConnectionManager<redis_swapplex::RedisDB<#ident>> =
14        redis_swapplex::ConnectionManager::new(<redis_swapplex::RedisDB<#ident>>::default);
15
16        &CONNECTION_MANAGER
17      }
18
19      fn state_cache(
20      ) -> &'static std::thread::LocalKey<std::cell::RefCell<redis_swapplex::arc_swap::Cache<&'static redis_swapplex::arc_swap::ArcSwapOption<redis_swapplex::ConnectionState>, Option<std::sync::Arc<redis_swapplex::ConnectionState>>>>>
21      {
22        thread_local! {
23          static STATE_CACHE:
24          std::cell::RefCell<redis_swapplex::arc_swap::Cache<&'static redis_swapplex::arc_swap::ArcSwapOption<redis_swapplex::ConnectionState>, Option<std::sync::Arc<redis_swapplex::ConnectionState>>>> = std::cell::RefCell::new(redis_swapplex::arc_swap::Cache::new(<#ident>::connection_manager().deref()));
25        }
26
27        &STATE_CACHE
28      }
29    }
30  };
31
32  expanded.into()
33}