grafbase_sdk_derive/
lib.rs1use proc_macro::TokenStream;
2use proc_macro2::{Ident, Span};
3use quote::quote;
4use syn::DeriveInput;
5
6#[proc_macro_derive(ResolverExtension)]
8pub fn resolver_extension(input: TokenStream) -> TokenStream {
9 let ast = syn::parse_macro_input!(input as DeriveInput);
10 init("resolver", ast)
11}
12
13#[proc_macro_derive(ContractsExtension)]
15pub fn contracts_extension(input: TokenStream) -> TokenStream {
16 let ast = syn::parse_macro_input!(input as DeriveInput);
17 init("contracts", ast)
18}
19
20#[proc_macro_derive(AuthenticationExtension)]
22pub fn authentication_extension(input: TokenStream) -> TokenStream {
23 let ast = syn::parse_macro_input!(input as DeriveInput);
24 init("authentication", ast)
25}
26
27#[proc_macro_derive(AuthorizationExtension)]
29pub fn authorization_extension(input: TokenStream) -> TokenStream {
30 let ast = syn::parse_macro_input!(input as DeriveInput);
31 init("authorization", ast)
32}
33
34#[proc_macro_derive(HooksExtension)]
35pub fn hooks_extension(input: TokenStream) -> TokenStream {
36 let ast = syn::parse_macro_input!(input as DeriveInput);
37 init("hooks", ast)
38}
39
40fn init(ext: &str, ast: DeriveInput) -> TokenStream {
41 let ext = Ident::new(ext, Span::call_site());
42 let name = &ast.ident;
43
44 let (_, ty_generics, _) = ast.generics.split_for_impl();
45
46 let ts = quote! {
47 #[doc(hidden)]
48 #[unsafe(export_name = "register-extension")]
49 pub extern "C" fn __register_extension() {
50 grafbase_sdk::extension::#ext::register::<#name #ty_generics>();
51 }
52 };
53
54 ts.into()
55}