#generic_where {
+ wrapped: ::std::boxed::Box<#wrapped_name<#generic_idents>>,
+ _marker: ::std::marker::PhantomData,
+ }
+
+ impl #generics ::yew::html::Properties for #props_name<#generic_idents> #generic_where {
+ type Builder = #builder_name<#start_step_name, #generic_idents>;
+
+ fn builder() -> Self::Builder {
+ #builder_name {
+ wrapped: ::std::boxed::Box::new(::std::default::Default::default()),
+ _marker: ::std::marker::PhantomData,
+ }
+ }
+ }
+
+ #(#step_methods)*
+
+ impl #generics #builder_name<#build_step_name, #generic_idents> #generic_where {
+ #[doc(hidden)]
+ #vis fn build(self) -> #props_name<#generic_idents> {
+ #props_name::<#generic_idents> {
+ #(#prop_field_setters)*
+ }
+ }
+ }
+ };
+
+ TokenStream::from(expanded)
+}
+
+fn wrapped_fields<'a>(
+ prop_fields: impl Iterator- ,
+) -> impl Iterator
- {
+ prop_fields.map(|pf| {
+ let PropField { name, ty, .. } = &pf;
+ if let Some(wrapped_name) = &pf.wrapped_name {
+ quote! {
+ #wrapped_name: ::std::option::Option<#ty>,
+ }
+ } else {
+ quote! {
+ #name: #ty,
+ }
+ }
+ })
+}
+
+fn wrapped_default_setters<'a>(
+ prop_fields: impl Iterator
- ,
+) -> impl Iterator
- {
+ prop_fields.map(|pf| {
+ if let Some(wrapped_name) = &pf.wrapped_name {
+ quote! {
+ #wrapped_name: ::std::default::Default::default(),
+ }
+ } else {
+ let name = &pf.name;
+ quote! {
+ #name: ::std::default::Default::default(),
+ }
+ }
+ })
+}
+
+fn prop_field_setters<'a>(
+ prop_fields: impl Iterator
- ,
+) -> impl Iterator
- {
+ prop_fields.map(|pf| {
+ let name = &pf.name;
+ if let Some(wrapped_name) = &pf.wrapped_name {
+ quote! {
+ #name: self.wrapped.#wrapped_name.unwrap(),
+ }
+ } else {
+ quote! {
+ #name: self.wrapped.#name,
+ }
+ }
+ })
+}
+
+fn find_props_meta_list(field: &syn::Field) -> Option {
+ let meta_list = field
+ .attrs
+ .iter()
+ .find_map(|attr| match attr.parse_meta().ok()? {
+ Meta::List(meta_list) => Some(meta_list),
+ _ => None,
+ })?;
+
+ if meta_list.ident == "props" {
+ Some(meta_list)
+ } else {
+ None
+ }
+}
+
+fn required_wrapper(named_field: &syn::Field) -> Result