Handle Option<Vec<_>> with a much cleaner option converter
[ldk-c-bindings] / c-bindings-gen / src / types.rs
index c02b1dd2114fc377a4065a8323d7976774f01dc6..8cc7d1eaa501f3bfcf16d80ae15a655999a631ab 100644 (file)
@@ -1717,10 +1717,10 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                                                                                (format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ &mut *{} }}", var_access))
                                                                        ], ") }", ContainerPrefixLocation::NoPrefix)),
                                                                EmptyValExpectedTy::OptionType =>
-                                                                       return Some(("{ /* ", vec![
-                                                                               (format!("*/ let {}_opt = {};", var_name, var_access),
-                                                                               format!("}} if {}_opt{} {{ None }} else {{ Some({{ {}_opt.take()", var_name, s, var_name))
-                                                                       ], "} }", ContainerPrefixLocation::PerConv)),
+                                                                       return Some(("{ /*", vec![
+                                                                               (format!("*/ let {}_opt = {}; if {}_opt{} {{ None }} else {{ Some({{", var_name, var_access, var_name, s),
+                                                                               format!("{{ {}_opt.take() }}", var_name))
+                                                                       ], "})} }", ContainerPrefixLocation::PerConv)),
                                                                EmptyValExpectedTy::NonPointer =>
                                                                        return Some(("if ", vec![
                                                                                (format!("{} {{ None }} else {{ Some(", s), format!("{}", var_access))
@@ -2685,10 +2685,16 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
                        } else if let syn::Type::Path(p_arg) = t {
                                if let Some(resolved) = self.maybe_resolve_path(&p_arg.path, generics) {
                                        if !self.is_primitive(&resolved) {
-                                               assert!(!is_ref); // We don't currently support outer reference types for non-primitive inners
+                                               if is_ref {
+                                                       // We don't currently support outer reference types for non-primitive inners
+                                                       return false;
+                                               }
                                        }
                                } else {
-                                       assert!(!is_ref); // We don't currently support outer reference types for non-primitive inners
+                                       if is_ref {
+                                               // We don't currently support outer reference types for non-primitive inners
+                                               return false;
+                                       }
                                }
                                if !self.write_c_type_intern(w, t, generics, false, false, false, true, true) { return false; }
                        } else {