@@ -1477,12 +1477,18 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
1477
1477
}
1478
1478
if let Some ( t) = single_contained {
1479
1479
if let syn:: Type :: Tuple ( syn:: TypeTuple { elems, .. } ) = t {
1480
- assert ! ( elems. is_empty( ) ) ;
1481
1480
let inner_name = self . get_c_mangled_container_type ( vec ! [ single_contained. unwrap( ) ] , generics, "Option" ) . unwrap ( ) ;
1482
- return Some ( ( "if " , vec ! [
1483
- ( format!( ".is_none() {{ {}::None }} else {{ {}::Some /*" ,
1484
- inner_name, inner_name) , format!( "" ) )
1485
- ] , " */}" , ContainerPrefixLocation :: PerConv ) ) ;
1481
+ if elems. is_empty ( ) {
1482
+ return Some ( ( "if " , vec ! [
1483
+ ( format!( ".is_none() {{ {}::None }} else {{ {}::Some /* " ,
1484
+ inner_name, inner_name) , format!( "" ) )
1485
+ ] , " */ }" , ContainerPrefixLocation :: PerConv ) ) ;
1486
+ } else {
1487
+ return Some ( ( "if " , vec ! [
1488
+ ( format!( ".is_none() {{ {}::None }} else {{ {}::Some(" ,
1489
+ inner_name, inner_name) , format!( "({}.unwrap())" , var_access) )
1490
+ ] , ") }" , ContainerPrefixLocation :: PerConv ) ) ;
1491
+ }
1486
1492
}
1487
1493
if let syn:: Type :: Reference ( syn:: TypeReference { elem, .. } ) = t {
1488
1494
if let syn:: Type :: Slice ( _) = & * * elem {
@@ -2039,6 +2045,8 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
2039
2045
write ! ( w, "{}" , sliceconv( false , None ) ) . unwrap ( ) ;
2040
2046
}
2041
2047
}
2048
+ } else if let syn:: Type :: Array ( _) = & * s. elem {
2049
+ write ! ( w, "{}" , sliceconv( false , Some ( ".map(|a| *a)" ) ) ) . unwrap ( ) ;
2042
2050
} else { unimplemented ! ( ) ; }
2043
2051
} ,
2044
2052
syn:: Type :: Tuple ( t) => {
@@ -2391,6 +2399,12 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
2391
2399
ptr_for_ref = true ;
2392
2400
convert_container ! ( "Slice" , 1 , || ty. iter( ) ) ;
2393
2401
unimplemented ! ( "convert_container should return true as container_lookup should succeed for slices" ) ;
2402
+ } else if let syn:: Type :: Array ( _) = & * s. elem {
2403
+ is_ref = false ;
2404
+ ptr_for_ref = true ;
2405
+ let arr_elem = [ ( * s. elem ) . clone ( ) ] ;
2406
+ convert_container ! ( "Slice" , 1 , || arr_elem. iter( ) ) ;
2407
+ unimplemented ! ( "convert_container should return true as container_lookup should succeed for slices" ) ;
2394
2408
} else { unimplemented ! ( ) }
2395
2409
} ,
2396
2410
syn:: Type :: Tuple ( t) => {
@@ -2901,6 +2915,22 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> {
2901
2915
let mut segments = syn:: punctuated:: Punctuated :: new ( ) ;
2902
2916
segments. push ( parse_quote ! ( Vec <#args>) ) ;
2903
2917
self . write_c_type_intern ( w, & syn:: Type :: Path ( syn:: TypePath { qself : None , path : syn:: Path { leading_colon : None , segments } } ) , generics, false , is_mut, ptr_for_ref, with_ref_lifetime, c_ty)
2918
+ } else if let syn:: Type :: Array ( a) = & * s. elem {
2919
+ if let syn:: Expr :: Lit ( l) = & a. len {
2920
+ if let syn:: Lit :: Int ( i) = & l. lit {
2921
+ let mut buf = Vec :: new ( ) ;
2922
+ self . write_rust_type ( & mut buf, generics, & * a. elem , false ) ;
2923
+ let arr_ty = String :: from_utf8 ( buf) . unwrap ( ) ;
2924
+
2925
+ let arr_str = format ! ( "[{}; {}]" , arr_ty, i. base10_digits( ) ) ;
2926
+ let ty = self . c_type_from_path ( & arr_str, false , ptr_for_ref) . unwrap ( )
2927
+ . rsplitn ( 2 , "::" ) . next ( ) . unwrap ( ) ;
2928
+
2929
+ let mangled_container = format ! ( "CVec_{}Z" , ty) ;
2930
+ write ! ( w, "{}::{}" , Self :: generated_container_path( ) , mangled_container) . unwrap ( ) ;
2931
+ self . check_create_container ( mangled_container, "Vec" , vec ! [ & * s. elem] , generics, false )
2932
+ } else { false }
2933
+ } else { false }
2904
2934
} else { false }
2905
2935
} ,
2906
2936
syn:: Type :: Tuple ( t) => {
0 commit comments