use proc_macro2::TokenStream;
use quote::quote;
use syn::{Data, DeriveInput, Fields};
use crate::attrs;
pub(crate) fn expand(input: DeriveInput) -> syn::Result<TokenStream> {
let ident = &input.ident;
let Data::Struct(data) = &input.data else {
return Err(syn::Error::new_spanned(
ident,
"FromQueryResult only supports structs",
));
};
let Fields::Named(fields) = &data.fields else {
return Err(syn::Error::new_spanned(
ident,
"FromQueryResult needs named fields",
));
};
let mut reads = Vec::new();
for f in &fields.named {
let name = f.ident.as_ref().expect("named");
let ty = &f.ty;
let mut column = name.to_string();
for item in attrs::parse(&f.attrs)? {
if item.key == "column_name" {
column = item.str_value()?;
}
}
reads.push(quote! {
#name: ::turso_orm::__private::get_field::<#ty>(row, prefix, #column)?,
});
}
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
Ok(quote! {
impl #impl_generics ::turso_orm::entity::FromQueryResult for #ident #ty_generics #where_clause {
fn from_query_result(row: &::turso_orm::__private::Row, prefix: &str) -> ::turso_orm::Result<Self> {
Ok(Self { #(#reads)* })
}
}
})
}