From 2473abf2f75b71f6246ac82cfa670e5ad399f8fd Mon Sep 17 00:00:00 2001 From: Uttarayan Mondal Date: Sat, 19 Aug 2023 04:09:34 +0530 Subject: [PATCH] [partial] --- comptime-builder-macros/src/lib.rs | 57 ++++++++++++++++++------------ examples/derive.rs | 2 +- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/comptime-builder-macros/src/lib.rs b/comptime-builder-macros/src/lib.rs index 1009531..16add26 100644 --- a/comptime-builder-macros/src/lib.rs +++ b/comptime-builder-macros/src/lib.rs @@ -4,9 +4,9 @@ use syn::*; pub fn builder_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input = parse_macro_input!(input as DeriveInput); - dbg!(derive_builder::derive(input) + derive_builder::derive(input) .unwrap_or_else(|err| err.into_compile_error()) - .into()) + .into() } mod derive_builder { @@ -16,6 +16,39 @@ mod derive_builder { use syn::token::Comma; use syn::*; + pub struct Builder {} + + impl Builder { + pub fn expr(&self) -> syn::ExprStruct { + todo!() + } + pub fn ty(&self) -> syn::Type { + todo!() + } + + pub fn ty_empty(&self) -> syn::Type { + syn::Type::Path(TypePath { + qself: None, + path: syn::Path { + leading_colon: None, + segments: Punctuated::from_iter(vec![PathSegment { + ident: builder_struct_name.clone(), + arguments: PathArguments::AngleBracketed(AngleBracketedGenericArguments { + colon2_token: None, + lt_token: Token![<](Span::call_site()), + args: core::iter::repeat::(parse_quote!( + #crate_name::Empty + )) + .take(gf.len() as usize - 1) + .collect(), + gt_token: Token![>](Span::call_site()), + }), + }]), + }, + }) + } + } + pub fn derive(input: DeriveInput) -> Result { let crate_name: syn::Path = parse_quote!(::comptime_builder); let fields = match input.data { @@ -37,26 +70,6 @@ mod derive_builder { // Use Generic type T{0..} to represent the fields let gf = generic_fields("T", fields)?; - let empty_builder_type: syn::Type = syn::Type::Path(TypePath { - qself: None, - path: syn::Path { - leading_colon: None, - segments: Punctuated::from_iter(vec![PathSegment { - ident: builder_struct_name.clone(), - arguments: PathArguments::AngleBracketed(AngleBracketedGenericArguments { - colon2_token: None, - lt_token: Token![<](Span::call_site()), - args: core::iter::repeat::(parse_quote!( - #crate_name::Empty - )) - .take(gf.len() as usize - 1) - .collect(), - gt_token: Token![>](Span::call_site()), - }), - }]), - }, - }); - let empty_builder = syn::ExprStruct { attrs: vec![], qself: None, diff --git a/examples/derive.rs b/examples/derive.rs index 7d5b9be..35de279 100644 --- a/examples/derive.rs +++ b/examples/derive.rs @@ -8,5 +8,5 @@ pub struct MyStruct { } pub fn main() { - + // echo hello }