grafbase_sdk_derive/
lib.rs

1use proc_macro::TokenStream;
2use proc_macro2::{Ident, Span};
3use quote::quote;
4use syn::DeriveInput;
5
6/// A proc macro for generating initialization code for a resolver extension.
7#[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/// A proc macro for generating initialization code for a contracts extension.
14#[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/// A proc macro for generating initialization code for an authentication extension.
21#[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/// A proc macro for generating initialization code for an authentication extension.
28#[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}