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