ouroboros_macro/generate/
summon_checker.rs1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::Error;
4
5use crate::info_structures::{ArgType, BuilderType, StructInfo};
6
7pub fn generate_checker_summoner(info: &StructInfo) -> Result<TokenStream, Error> {
8 let mut code: Vec<TokenStream> = Vec::new();
9 let mut params: Vec<TokenStream> = Vec::new();
10 let mut value_consumers: Vec<TokenStream> = Vec::new();
11 let mut template_consumers: Vec<TokenStream> = Vec::new();
12 for field in &info.fields {
13 let field_name = &field.name;
14
15 let arg_type = field.make_constructor_arg_type(info, BuilderType::Sync)?;
16 if let ArgType::Plain(plain_type) = arg_type {
17 params.push(quote! { #field_name: #plain_type });
19 } else if let ArgType::TraitBound(bound_type) = arg_type {
20 let builder_name = field.builder_name();
24 params.push(quote! { #builder_name : impl #bound_type });
25 let mut builder_args = Vec::new();
26 for (_, borrow) in field.borrows.iter().enumerate() {
27 let borrowed_name = &info.fields[borrow.index].name;
28 if borrow.mutable {
29 builder_args.push(quote! { &mut #borrowed_name });
30 } else {
31 builder_args.push(quote! { &#borrowed_name });
32 }
33 }
34 code.push(quote! { let #field_name = #builder_name (#(#builder_args),*); });
35 }
36 if field.is_mutably_borrowed() {
37 code.push(quote! { let mut #field_name = #field_name; });
38 } else {
39 code.push(quote! { let #field_name = #field_name; });
40 value_consumers.push(quote! { #field_name: &#field_name });
41 }
42 }
43 for (_ty, ident) in info.generic_consumers() {
44 template_consumers.push(quote! { #ident: ::core::marker::PhantomData });
45 }
46 let generic_params = info.generic_params();
47 let where_clause = &info.generics.where_clause;
48 let borrowed_generic_params_inferred = info.borrowed_generic_params_inferred();
49 Ok(quote! {
50 fn check_if_okay_according_to_checkers<#generic_params>(
51 #(#params,)*
52 )
53 #where_clause
54 {
55 #(#code;)*
56 BorrowedFields::#borrowed_generic_params_inferred {
57 #(#value_consumers,)*
58 #(#template_consumers,)*
59 };
60 }
61 })
62}