scyllax_macros_core/queries/
write.rs1use 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 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}