derive_diesel_connection/
lib.rs

1use quote::quote;
2use syn::{parse_macro_input, DeriveInput};
3
4#[proc_macro_derive(PoolContext)]
5pub fn derive_pool_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 diesel_connection::PoolContext for #ident {
11      fn pool() -> &'static diesel::r2d2::Pool<diesel::r2d2::ConnectionManager<Self::Connection>> {
12        #[diesel_connection::static_init::dynamic(0)]
13
14        static POOL: diesel::r2d2::Pool<
15          diesel::r2d2::ConnectionManager<<#ident as ConnectionInfo>::Connection>
16        > = <#ident as diesel_connection::ConnectionInfo>::create_pool().expect("Invalid database url");
17
18        unsafe { &POOL }
19      }
20    }
21  };
22
23  expanded.into()
24}