fn serialize_tuple_struct_visitor()

in sgx_serialize_derive/src/encode.rs [405:460]


fn serialize_tuple_struct_visitor(
    fields: &[Field],
    is_struct: bool,
) -> Vec<Tokens> {
    fields
        .iter()
        .enumerate()
        .map(
            |(i, field)| {
                let field_expr = if is_struct {
                    match field.ident {
                        Some(ref ident) => {
                            let id = Ident::new(format!("\"{}\"", ident.clone().as_ref()));
                            quote!(#id)
                        }
                        None => {
                            panic!("struct filed must have name!")
                        }
                    }
                } else {
                    let id = Ident::new(format!("\"_field{}\"", i));
                    quote!(#id)
                };

                let arg = Ident::new(format!("__self_0_{}", i));
                let field_arg = quote!(#arg);

                if fields.iter().count() == i+1 {
                    quote! {
                        return _e.emit_struct_field(#field_expr,
                                                    #i,
                                                    |_e| -> _ {
                                                        ::sgx_serialize::Serializable::encode(&(*#field_arg), _e)
                                                    });
                    }
                } else {
                    quote! {
                        match _e.emit_struct_field(#field_expr,
                                                    #i,
                                                    |_e| -> _ {
                                                        ::sgx_serialize::Serializable::encode(&(*#field_arg),
                                                                                        _e)
                                                    })
                            {
                            ::std::result::Result::Ok(__try_var)
                            => __try_var,
                            ::std::result::Result::Err(__try_var)
                            =>
                            return ::std::result::Result::Err(__try_var),
                        }
                    }
                }
            },
        )
        .collect()
}