grafbase_sdk_derive/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::DeriveInput;
4
5/// A proc macro for generating initialization code for a resolver extension.
6///
7/// Add it on top of the type which implements `Extension` and `Resolver` traits to
8/// register it as a resolver extension.
9#[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/// A proc macro for generating initialization code for an authentication extension.
16///
17/// Add it on top of the type which implements `Extension` and `Authenticator` traits to
18/// register it as a resolver extension.
19#[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/// A proc macro for generating initialization code for an authentication extension.
26///
27/// Add it on top of the type which implements `Extension` and `Authenticator` traits to
28/// register it as a resolver extension.
29#[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}