Allow one to specify that a field of a model is a foreign key. It will generate a bunch of helper methods to query related entities from one entity.
41 lines
1.4 KiB
Rust
41 lines
1.4 KiB
Rust
use proc_macro::TokenStream;
|
|
use quote::quote;
|
|
use syn::{DeriveInput, Fields, parse_macro_input};
|
|
|
|
#[proc_macro_attribute]
|
|
pub fn sql_generator_model(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
item
|
|
}
|
|
|
|
#[proc_macro_derive(SqlGeneratorDerive, attributes(sql_generator_field))]
|
|
pub fn derive_sql_generator_model(_input: TokenStream) -> TokenStream {
|
|
TokenStream::new()
|
|
}
|
|
|
|
#[proc_macro_derive(SqlGeneratorModelWithId, attributes(sql_generator_field))]
|
|
pub fn derive_sql_generator_model_with_id(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input as DeriveInput);
|
|
let name = input.ident;
|
|
|
|
// Extract the fields of the struct
|
|
if let syn::Data::Struct(data) = input.data {
|
|
if let Fields::Named(fields) = data.fields {
|
|
for field in fields.named {
|
|
if field.ident.as_ref().map_or(false, |ident| ident == "id") {
|
|
let expanded = quote! {
|
|
impl DatabaseLine for #name {
|
|
fn id(&self) -> String {
|
|
self.id.clone()
|
|
}
|
|
}
|
|
};
|
|
return TokenStream::from(expanded);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// If `id` field is not found, return an error
|
|
panic!("Expected struct with a named field `id` of type String")
|
|
}
|
|
|