瀏覽代碼

make optional props accept T or Option<T>

Evan Almloff 1 年之前
父節點
當前提交
be94c69f11
共有 2 個文件被更改,包括 15 次插入24 次删除
  1. 6 0
      examples/optional_props.rs
  2. 9 24
      packages/core-macro/src/props/mod.rs

+ 6 - 0
examples/optional_props.rs

@@ -12,6 +12,12 @@ fn main() {
 
 fn app(cx: Scope) -> Element {
     cx.render(rsx! {
+        Button {
+            a: "asd".to_string(),
+            c: "asd".to_string(),
+            d: Some("asd".to_string()),
+            e: Some("asd".to_string()),
+        }
         Button {
             a: "asd".to_string(),
             c: "asd".to_string(),

+ 9 - 24
packages/core-macro/src/props/mod.rs

@@ -783,31 +783,16 @@ Finally, call `.build()` to create the instance of `{name}`.
                 None => quote!(),
             };
 
-            // NOTE: both auto_into and strip_option affect `arg_type` and `arg_expr`, but the order of
-            // nesting is different so we have to do this little dance.
-            let arg_type = if field.builder_attr.strip_option {
-                field.type_from_inside_option(false).ok_or_else(|| {
-                    Error::new_spanned(
-                        field_type,
-                        "can't `strip_option` - field is not `Option<...>`",
+            let arg_type = field_type;
+            let (arg_type, arg_expr) =
+                if field.builder_attr.auto_into || field.builder_attr.strip_option {
+                    (
+                        quote!(impl ::core::convert::Into<#arg_type>),
+                        quote!(#field_name.into()),
                     )
-                })?
-            } else {
-                field_type
-            };
-            let (arg_type, arg_expr) = if field.builder_attr.auto_into {
-                (
-                    quote!(impl ::core::convert::Into<#arg_type>),
-                    quote!(#field_name.into()),
-                )
-            } else {
-                (quote!(#arg_type), quote!(#field_name))
-            };
-            let arg_expr = if field.builder_attr.strip_option {
-                quote!(Some(#arg_expr))
-            } else {
-                arg_expr
-            };
+                } else {
+                    (quote!(#arg_type), quote!(#field_name))
+                };
 
             let repeated_fields_error_type_name = syn::Ident::new(
                 &format!(