grafbase_sdk_derive/
lib.rs1use proc_macro::TokenStream;
2use quote::quote;
3use syn::DeriveInput;
4
5#[proc_macro_derive(ResolverExtension)]
10pub fn resolver_extension(input: TokenStream) -> TokenStream {
11 let ast = syn::parse_macro_input!(input as DeriveInput);
12 expand(resolver_init(ast))
13}
14
15#[proc_macro_derive(AuthenticationExtension)]
20pub fn authentication_extension(input: TokenStream) -> TokenStream {
21 let ast = syn::parse_macro_input!(input as DeriveInput);
22 expand(authentication_init(ast))
23}
24
25#[proc_macro_derive(AuthorizationExtension)]
30pub fn authorization_extension(input: TokenStream) -> TokenStream {
31 let ast = syn::parse_macro_input!(input as DeriveInput);
32 expand(authorization_init(ast))
33}
34
35#[proc_macro_derive(HooksExtension)]
36pub fn hooks_extension(input: TokenStream) -> TokenStream {
37 let ast = syn::parse_macro_input!(input as DeriveInput);
38 expand(hooks_init(ast))
39}
40
41fn expand(init: proc_macro2::TokenStream) -> TokenStream {
42 let token_stream = quote! {
43 #[doc(hidden)]
44 #[unsafe(export_name = "register-extension")]
45 pub extern "C" fn __register_extension() {
46 #init
47 }
48 };
49
50 TokenStream::from(token_stream)
51}
52
53fn resolver_init(ast: DeriveInput) -> proc_macro2::TokenStream {
54 let name = &ast.ident;
55
56 let (_, ty_generics, _) = ast.generics.split_for_impl();
57
58 quote! {
59 grafbase_sdk::extension::resolver::register::<#name #ty_generics>();
60 }
61}
62
63fn authentication_init(ast: DeriveInput) -> proc_macro2::TokenStream {
64 let name = &ast.ident;
65
66 let (_, ty_generics, _) = ast.generics.split_for_impl();
67
68 quote! {
69 grafbase_sdk::extension::authentication::register::<#name #ty_generics>();
70 }
71}
72
73fn authorization_init(ast: DeriveInput) -> proc_macro2::TokenStream {
74 let name = &ast.ident;
75
76 let (_, ty_generics, _) = ast.generics.split_for_impl();
77
78 quote! {
79 grafbase_sdk::extension::authorization::register::<#name #ty_generics>();
80 }
81}
82
83fn hooks_init(ast: DeriveInput) -> proc_macro2::TokenStream {
84 let name = &ast.ident;
85
86 let (_, ty_generics, _) = ast.generics.split_for_impl();
87
88 quote! {
89 grafbase_sdk::extension::hooks::register::<#name #ty_generics>();
90 }
91}