- let mut v = Vec::new();
- let ret_ref = self.write_empty_rust_val_check_suffix(generics, &mut v, t);
- let s = String::from_utf8(v).unwrap();
- match ret_ref {
- EmptyValExpectedTy::ReferenceAsPointer =>
- return Some(("if ", vec![
- (format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ &mut *{} }}", var_access))
- ], ") }")),
- EmptyValExpectedTy::OwnedPointer =>
- return Some(("if ", vec![
- (format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ *Box::from_raw({}) }}", var_access))
- ], ") }")),
- EmptyValExpectedTy::NonPointer =>
- return Some(("if ", vec![
- (format!("{} {{ None }} else {{ Some(", s), format!("{}", var_access))
- ], ") }")),
+ match t {
+ syn::Type::Reference(_)|syn::Type::Path(_)|syn::Type::Slice(_) => {
+ let mut v = Vec::new();
+ let ret_ref = self.write_empty_rust_val_check_suffix(generics, &mut v, t);
+ let s = String::from_utf8(v).unwrap();
+ match ret_ref {
+ EmptyValExpectedTy::ReferenceAsPointer =>
+ return Some(("if ", vec![
+ (format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ &mut *{} }}", var_access))
+ ], ") }", ContainerPrefixLocation::NoPrefix)),
+ EmptyValExpectedTy::OwnedPointer => {
+ if let syn::Type::Slice(_) = t {
+ panic!();
+ }
+ return Some(("if ", vec![
+ (format!("{} {{ None }} else {{ Some(", s), format!("unsafe {{ *Box::from_raw({}) }}", var_access))
+ ], ") }", ContainerPrefixLocation::NoPrefix));
+ }
+ EmptyValExpectedTy::NonPointer =>
+ return Some(("if ", vec![
+ (format!("{} {{ None }} else {{ Some(", s), format!("{}", var_access))
+ ], ") }", ContainerPrefixLocation::PerConv)),
+ }
+ },
+ syn::Type::Tuple(_) => {
+ return Some(("if ", vec![(".is_some() { Some(".to_string(), format!("{}.take()", var_access))], ") } else { None }", ContainerPrefixLocation::PerConv))
+ },
+ _ => unimplemented!(),