X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=c-bindings-gen%2Fsrc%2Ftypes.rs;fp=c-bindings-gen%2Fsrc%2Ftypes.rs;h=ab85f7b424868c59b158bf5bfe1469f5732df075;hb=7dd9d6f40cc5c7d251cc45820e350f669e3e1dfb;hp=7e781a03e2c500b0227e23138f4ba09a9e20222d;hpb=c5c2d464ba56deb6ce6a32df14adecebcbdb07cc;p=rust-lightning diff --git a/c-bindings-gen/src/types.rs b/c-bindings-gen/src/types.rs index 7e781a03..ab85f7b4 100644 --- a/c-bindings-gen/src/types.rs +++ b/c-bindings-gen/src/types.rs @@ -1796,24 +1796,14 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { write!(w, "{}", resolved_generic).unwrap(); } else if let Some(c_type) = self.c_type_from_path(&resolved_generic, is_ref, false) { if self.is_known_container(&resolved_generic, is_ref) { - if resolved_generic == "Result" { - let mut inner_args = Vec::new(); - if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments { - for arg in args.args.iter() { - if let syn::GenericArgument::Type(t) = arg { inner_args.push(t) } else { unimplemented!() }; - } - } else { unimplemented!(); } - self.write_c_mangled_container_path(w, inner_args, generics, &resolved_generic, is_ref, false, false); - } else { - write!(w, "{}::C{}Templ<", Self::container_templ_path(), single_ident_generic_path_to_ident(&p_arg.path).unwrap()).unwrap(); - assert_eq!(p_arg.path.segments.len(), 1); - if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments { - self.write_template_generics(w, &mut args.args.iter().map(|gen| - if let syn::GenericArgument::Type(t) = gen { t } else { unimplemented!() }), - generics, is_ref, in_crate); - } else { unimplemented!(); } - write!(w, ">").unwrap(); - } + assert!(resolved_generic == "Vec" || resolved_generic == "Result"); + let mut inner_args = Vec::new(); + if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments { + for arg in args.args.iter() { + if let syn::GenericArgument::Type(t) = arg { inner_args.push(t) } else { unimplemented!() }; + } + } else { unimplemented!(); } + assert!(self.write_c_mangled_container_path(w, inner_args, generics, &resolved_generic, is_ref, false, false)); } else if resolved_generic == "Option" { if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments { self.write_template_generics(w, &mut args.args.iter().map(|gen| @@ -1897,6 +1887,15 @@ impl<'a, 'c: 'a> TypeResolver<'a, 'c> { if is_clonable { self.crate_types.clonable_types.insert(Self::generated_container_path().to_owned() + "::" + &mangled_container); } + } else if container_type == "Vec" { + let mut a_ty: Vec = Vec::new(); + self.write_template_generics(&mut a_ty, &mut args.iter().map(|t| *t), generics, is_ref, true); + let ty = String::from_utf8(a_ty).unwrap(); + let is_clonable = self.is_clonable(&ty); + write_vec_block(&mut created_container, &mangled_container, &ty, is_clonable); + if is_clonable { + self.crate_types.clonable_types.insert(Self::generated_container_path().to_owned() + "::" + &mangled_container); + } } else { write!(&mut created_container, "pub type {} = ", mangled_container).unwrap(); write!(&mut created_container, "{}::C{}Templ<", Self::container_templ_path(), container_type).unwrap();