derive_redis_swapplex/
lib.rs1use 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}