Skip to main content

better_auth_derive/
lib.rs

1//! Derive macros for better-auth entity traits.
2//!
3//! Provides `#[derive(AuthUser)]`, `#[derive(AuthSession)]`, etc. to auto-implement
4//! the entity traits from `better_auth_core::entity` for custom struct types.
5//!
6//! # Example
7//!
8//! ```rust,ignore
9//! use better_auth_derive::AuthUser;
10//!
11//! #[derive(Clone, Debug, Serialize, AuthUser)]
12//! pub struct MyUser {
13//!     pub id: String,
14//!     pub email: Option<String>,
15//!     #[auth(field = "name")]
16//!     pub display_name: Option<String>,
17//!     pub email_verified: bool,
18//!     pub image: Option<String>,
19//!     pub created_at: DateTime<Utc>,
20//!     pub updated_at: DateTime<Utc>,
21//!     pub username: Option<String>,
22//!     pub display_username: Option<String>,
23//!     pub two_factor_enabled: bool,
24//!     pub role: Option<String>,
25//!     pub banned: bool,
26//!     pub ban_reason: Option<String>,
27//!     pub ban_expires: Option<DateTime<Utc>>,
28//!     pub metadata: serde_json::Value,
29//! }
30//! ```
31
32mod auth_derive;
33mod from_row;
34mod helpers;
35mod memory_derive;
36mod plugin_config;
37
38use proc_macro::TokenStream;
39use quote::quote;
40use syn::{DeriveInput, parse_macro_input};
41
42use auth_derive::{
43    AUTH_ACCOUNT_GETTERS, AUTH_INVITATION_GETTERS, AUTH_MEMBER_GETTERS, AUTH_ORGANIZATION_GETTERS,
44    AUTH_PASSKEY_GETTERS, AUTH_SESSION_GETTERS, AUTH_TWO_FACTOR_GETTERS, AUTH_USER_GETTERS,
45    AUTH_VERIFICATION_GETTERS, derive_entity_trait, derive_meta_trait,
46};
47use from_row::maybe_gen_from_row;
48use memory_derive::{
49    MEMORY_ACCOUNT_DEF, MEMORY_INVITATION_DEF, MEMORY_MEMBER_DEF, MEMORY_ORGANIZATION_DEF,
50    MEMORY_SESSION_DEF, MEMORY_USER_DEF, MEMORY_VERIFICATION_DEF, derive_memory_trait,
51};
52
53#[proc_macro_derive(AuthUser, attributes(auth))]
54pub fn derive_auth_user(input: TokenStream) -> TokenStream {
55    let input = parse_macro_input!(input as DeriveInput);
56    let t = derive_entity_trait(
57        &input,
58        quote! { ::better_auth_core::entity::AuthUser },
59        "AuthUser",
60        AUTH_USER_GETTERS,
61    );
62    let m = derive_meta_trait(
63        &input,
64        quote! { ::better_auth_core::entity::AuthUserMeta },
65        "AuthUserMeta",
66        AUTH_USER_GETTERS,
67    );
68    let r = maybe_gen_from_row(&input);
69    quote! { #t #m #r }.into()
70}
71
72#[proc_macro_derive(AuthSession, attributes(auth))]
73pub fn derive_auth_session(input: TokenStream) -> TokenStream {
74    let input = parse_macro_input!(input as DeriveInput);
75    let t = derive_entity_trait(
76        &input,
77        quote! { ::better_auth_core::entity::AuthSession },
78        "AuthSession",
79        AUTH_SESSION_GETTERS,
80    );
81    let m = derive_meta_trait(
82        &input,
83        quote! { ::better_auth_core::entity::AuthSessionMeta },
84        "AuthSessionMeta",
85        AUTH_SESSION_GETTERS,
86    );
87    let r = maybe_gen_from_row(&input);
88    quote! { #t #m #r }.into()
89}
90
91#[proc_macro_derive(AuthAccount, attributes(auth))]
92pub fn derive_auth_account(input: TokenStream) -> TokenStream {
93    let input = parse_macro_input!(input as DeriveInput);
94    let t = derive_entity_trait(
95        &input,
96        quote! { ::better_auth_core::entity::AuthAccount },
97        "AuthAccount",
98        AUTH_ACCOUNT_GETTERS,
99    );
100    let m = derive_meta_trait(
101        &input,
102        quote! { ::better_auth_core::entity::AuthAccountMeta },
103        "AuthAccountMeta",
104        AUTH_ACCOUNT_GETTERS,
105    );
106    let r = maybe_gen_from_row(&input);
107    quote! { #t #m #r }.into()
108}
109
110#[proc_macro_derive(AuthOrganization, attributes(auth))]
111pub fn derive_auth_organization(input: TokenStream) -> TokenStream {
112    let input = parse_macro_input!(input as DeriveInput);
113    let t = derive_entity_trait(
114        &input,
115        quote! { ::better_auth_core::entity::AuthOrganization },
116        "AuthOrganization",
117        AUTH_ORGANIZATION_GETTERS,
118    );
119    let m = derive_meta_trait(
120        &input,
121        quote! { ::better_auth_core::entity::AuthOrganizationMeta },
122        "AuthOrganizationMeta",
123        AUTH_ORGANIZATION_GETTERS,
124    );
125    let r = maybe_gen_from_row(&input);
126    quote! { #t #m #r }.into()
127}
128
129#[proc_macro_derive(AuthMember, attributes(auth))]
130pub fn derive_auth_member(input: TokenStream) -> TokenStream {
131    let input = parse_macro_input!(input as DeriveInput);
132    let t = derive_entity_trait(
133        &input,
134        quote! { ::better_auth_core::entity::AuthMember },
135        "AuthMember",
136        AUTH_MEMBER_GETTERS,
137    );
138    let m = derive_meta_trait(
139        &input,
140        quote! { ::better_auth_core::entity::AuthMemberMeta },
141        "AuthMemberMeta",
142        AUTH_MEMBER_GETTERS,
143    );
144    let r = maybe_gen_from_row(&input);
145    quote! { #t #m #r }.into()
146}
147
148#[proc_macro_derive(AuthInvitation, attributes(auth))]
149pub fn derive_auth_invitation(input: TokenStream) -> TokenStream {
150    let input = parse_macro_input!(input as DeriveInput);
151    let t = derive_entity_trait(
152        &input,
153        quote! { ::better_auth_core::entity::AuthInvitation },
154        "AuthInvitation",
155        AUTH_INVITATION_GETTERS,
156    );
157    let m = derive_meta_trait(
158        &input,
159        quote! { ::better_auth_core::entity::AuthInvitationMeta },
160        "AuthInvitationMeta",
161        AUTH_INVITATION_GETTERS,
162    );
163    let r = maybe_gen_from_row(&input);
164    quote! { #t #m #r }.into()
165}
166
167#[proc_macro_derive(AuthVerification, attributes(auth))]
168pub fn derive_auth_verification(input: TokenStream) -> TokenStream {
169    let input = parse_macro_input!(input as DeriveInput);
170    let t = derive_entity_trait(
171        &input,
172        quote! { ::better_auth_core::entity::AuthVerification },
173        "AuthVerification",
174        AUTH_VERIFICATION_GETTERS,
175    );
176    let m = derive_meta_trait(
177        &input,
178        quote! { ::better_auth_core::entity::AuthVerificationMeta },
179        "AuthVerificationMeta",
180        AUTH_VERIFICATION_GETTERS,
181    );
182    let r = maybe_gen_from_row(&input);
183    quote! { #t #m #r }.into()
184}
185
186#[proc_macro_derive(AuthTwoFactor, attributes(auth))]
187pub fn derive_auth_two_factor(input: TokenStream) -> TokenStream {
188    let input = parse_macro_input!(input as DeriveInput);
189    let t = derive_entity_trait(
190        &input,
191        quote! { ::better_auth_core::entity::AuthTwoFactor },
192        "AuthTwoFactor",
193        AUTH_TWO_FACTOR_GETTERS,
194    );
195    let m = derive_meta_trait(
196        &input,
197        quote! { ::better_auth_core::entity::AuthTwoFactorMeta },
198        "AuthTwoFactorMeta",
199        AUTH_TWO_FACTOR_GETTERS,
200    );
201    let r = maybe_gen_from_row(&input);
202    quote! { #t #m #r }.into()
203}
204
205#[proc_macro_derive(AuthPasskey, attributes(auth))]
206pub fn derive_auth_passkey(input: TokenStream) -> TokenStream {
207    let input = parse_macro_input!(input as DeriveInput);
208    let t = derive_entity_trait(
209        &input,
210        quote! { ::better_auth_core::entity::AuthPasskey },
211        "AuthPasskey",
212        AUTH_PASSKEY_GETTERS,
213    );
214    let m = derive_meta_trait(
215        &input,
216        quote! { ::better_auth_core::entity::AuthPasskeyMeta },
217        "AuthPasskeyMeta",
218        AUTH_PASSKEY_GETTERS,
219    );
220    let r = maybe_gen_from_row(&input);
221    quote! { #t #m #r }.into()
222}
223
224#[proc_macro_derive(MemoryUser, attributes(auth))]
225pub fn derive_memory_user(input: TokenStream) -> TokenStream {
226    let input = parse_macro_input!(input as DeriveInput);
227    derive_memory_trait(&input, &MEMORY_USER_DEF).into()
228}
229
230#[proc_macro_derive(MemorySession, attributes(auth))]
231pub fn derive_memory_session(input: TokenStream) -> TokenStream {
232    let input = parse_macro_input!(input as DeriveInput);
233    derive_memory_trait(&input, &MEMORY_SESSION_DEF).into()
234}
235
236#[proc_macro_derive(MemoryAccount, attributes(auth))]
237pub fn derive_memory_account(input: TokenStream) -> TokenStream {
238    let input = parse_macro_input!(input as DeriveInput);
239    derive_memory_trait(&input, &MEMORY_ACCOUNT_DEF).into()
240}
241
242#[proc_macro_derive(MemoryOrganization, attributes(auth))]
243pub fn derive_memory_organization(input: TokenStream) -> TokenStream {
244    let input = parse_macro_input!(input as DeriveInput);
245    derive_memory_trait(&input, &MEMORY_ORGANIZATION_DEF).into()
246}
247
248#[proc_macro_derive(MemoryMember, attributes(auth))]
249pub fn derive_memory_member(input: TokenStream) -> TokenStream {
250    let input = parse_macro_input!(input as DeriveInput);
251    derive_memory_trait(&input, &MEMORY_MEMBER_DEF).into()
252}
253
254#[proc_macro_derive(MemoryInvitation, attributes(auth))]
255pub fn derive_memory_invitation(input: TokenStream) -> TokenStream {
256    let input = parse_macro_input!(input as DeriveInput);
257    derive_memory_trait(&input, &MEMORY_INVITATION_DEF).into()
258}
259
260#[proc_macro_derive(MemoryVerification, attributes(auth))]
261pub fn derive_memory_verification(input: TokenStream) -> TokenStream {
262    let input = parse_macro_input!(input as DeriveInput);
263    derive_memory_trait(&input, &MEMORY_VERIFICATION_DEF).into()
264}
265
266#[proc_macro_derive(PluginConfig, attributes(plugin, config))]
267pub fn derive_plugin_config(input: TokenStream) -> TokenStream {
268    let input = parse_macro_input!(input as DeriveInput);
269    plugin_config::derive_plugin_config(&input).into()
270}