scyllax_macros_core/queries/
write.rs

1use crate::queries::impl_generic_query;
2use darling::{export::NestedMeta, FromMeta};
3use proc_macro2::TokenStream;
4use quote::quote;
5use syn::ItemStruct;
6
7#[derive(FromMeta)]
8pub(crate) struct WriteQueryOptions {
9    query: Option<String>,
10    query_nocheck: Option<String>,
11}
12
13pub fn expand(args: TokenStream, item: TokenStream) -> TokenStream {
14    let attr_args = match NestedMeta::parse_meta_list(args.clone()) {
15        Ok(args) => args,
16        Err(e) => return darling::Error::from(e).write_errors(),
17    };
18
19    let args = match WriteQueryOptions::from_list(&attr_args) {
20        Ok(o) => o,
21        Err(e) => return e.write_errors(),
22    };
23
24    let input: ItemStruct = match syn::parse2(item.clone()) {
25        Ok(it) => it,
26        Err(e) => return e.to_compile_error(),
27    };
28
29    let query = if let Some(query) = args.query {
30        // match parse_query(&input, &query) {
31        //     Ok(_) => (),
32        //     Err(e) => return e.to_compile_error(),
33        // };
34
35        query
36    } else if let Some(query) = args.query_nocheck {
37        query
38    } else {
39        unreachable!()
40    };
41
42    let impl_query = impl_generic_query(&input, query, None);
43    let struct_ident = &input.ident;
44
45    quote! {
46        #[derive(std::fmt::Debug, std::clone::Clone, PartialEq, Hash, scylla::SerializeRow)]
47        #input
48
49        #impl_query
50
51        impl scyllax::prelude::WriteQuery for #struct_ident {}
52    }
53}