ouroboros_macro/generate/
struc.rs1use crate::{
2 info_structures::StructInfo,
3 utils::{self, replace_this_with_lifetime},
4};
5use proc_macro2::TokenStream;
6use quote::quote;
7use syn::Error;
8
9pub fn create_actual_struct_def(info: &StructInfo) -> Result<TokenStream, Error> {
11 let visibility = utils::submodule_contents_visibility(&info.vis);
12 let mut fields = Vec::new();
13 for (ty, ident) in info.generic_consumers() {
14 fields.push(quote! { #ident: ::core::marker::PhantomData<#ty> });
15 }
16 let generic_params = info.generic_params();
17 let generic_args = info.generic_arguments();
18 let generic_where = &info.generics.where_clause;
19 let ident = &info.ident;
20 let internal_ident = &info.internal_ident;
21 Ok(quote! {
22 #[repr(transparent)]
23 #visibility struct #ident <#generic_params> #generic_where {
24 actual_data: ::core::mem::MaybeUninit<#internal_ident<#(#generic_args),*>>,
25 }
26 })
27}
28
29pub fn create_internal_struct_def(info: &StructInfo) -> Result<TokenStream, Error> {
36 let ident = &info.internal_ident;
37 let generics = &info.generics;
38
39 let field_defs: Vec<_> = info
40 .fields
41 .iter()
42 .rev()
46 .map(|field| {
47 let name = &field.name;
48 let ty = field.stored_type();
49 quote! {
50 #[doc(hidden)]
51 #name: #ty
52 }
53 })
54 .collect();
55
56 let mut where_clause = quote! {};
58 if let Some(clause) = &generics.where_clause {
59 where_clause = quote! { #clause };
60 }
61 let def = quote! {
62 struct #ident #generics #where_clause {
63 #(#field_defs),*
64 }
65 };
66
67 let fake_lifetime = info.fake_lifetime();
69 let def = replace_this_with_lifetime(quote! { #def }, fake_lifetime.clone());
70
71 Ok(def)
72}