use Formatter::debug_struct for packet debug impl #23
| @ -205,55 +205,59 @@ fn generate_psopacket_impl(pkt_cmd: u16, name: syn::Ident, attrs: &Vec<AttrType> | ||||
| } | ||||
| 
 | ||||
| fn generate_debug_impl(name: syn::Ident, attrs: &Vec<AttrType>) -> proc_macro2::TokenStream { | ||||
|     let mut dbg_write = Vec::new(); | ||||
|     for attr in attrs { | ||||
|         let element = match attr { | ||||
|             AttrType::Value(ty, name, meta) => { | ||||
|                 let ident_str = name.to_string(); | ||||
|                 let type_str = ty.path.segments[0].ident.to_string(); | ||||
|                 match meta { | ||||
|                     AttrMeta::NoDebug => quote! { | ||||
|                         write!(f, "    {} {}: [...]\n", #ident_str, #type_str)?; | ||||
|                     }, | ||||
|                     _ => quote! { | ||||
|                         write!(f, "    {} {}: {:?}\n", #ident_str, #type_str, self.#name)?; | ||||
|     let dbg_write = attrs | ||||
|         .iter() | ||||
|         .map(|attr| { | ||||
|             match attr { | ||||
|                 AttrType::Value(ty, name, meta) => { | ||||
|                     let ident_str = name.to_string(); | ||||
|                     let type_str = ty.path.segments[0].ident.to_string(); | ||||
|                     match meta { | ||||
|                         AttrMeta::NoDebug => quote! { | ||||
|                             .field(&format!("{} [{}]", #ident_str, #type_str), &format_args!("[...]")) | ||||
|                         }, | ||||
|                         _ => quote! { | ||||
|                             .field(&format!("{} [{}]", #ident_str, #type_str), &self.#name) | ||||
|                         } | ||||
|                     } | ||||
|                 }, | ||||
|                 AttrType::Array(ty, name, len, meta) => { | ||||
|                     let ident_str = name.to_string(); | ||||
|                     let type_str = ty.path.segments[0].ident.to_string(); | ||||
|                     match meta { | ||||
|                         AttrMeta::Utf8 => quote! { | ||||
|                             .field(&format!("{} [utf8; {}]", #ident_str, #len), | ||||
|                                    match std::str::from_utf8(&self.#name) { | ||||
|                                        Ok(ref s) => s, | ||||
|                                        Err(_) => &self.#name | ||||
|                                    }) | ||||
|                         }, | ||||
|                         AttrMeta::Utf16 => quote! { | ||||
|                             .field(&format!("{} [utf16; {}]", #ident_str, #len), | ||||
|                                    match std::str::from_utf16(&self.#name) { | ||||
|                                        Ok(ref s) => s, | ||||
|                                        Err(_) => &self.#name | ||||
|                                    }) | ||||
|                         }, | ||||
|                         AttrMeta::NoDebug => quote! { | ||||
|                             .field(&format!("{} [{}; {}]", #ident_str, #type_str, #len), &format_args!("[...]")) | ||||
|                         }, | ||||
|                         _ => quote! { | ||||
|                             .field(&format!("{} [{}; {}]", #ident_str, #type_str, #len), &format_args!("{:?}", &self.#name)) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             AttrType::Array(ty, name, len, meta) => { | ||||
|                 let ident_str = name.to_string(); | ||||
|                 let type_str = ty.path.segments[0].ident.to_string(); | ||||
|                 match meta { | ||||
|                     AttrMeta::Utf8 => quote! { | ||||
|                         match std::str::from_utf8(&self.#name) { | ||||
|                             Ok(v) => write!(f, "    {} [utf8; {}]: {:?}\n", #ident_str, #len, v)?, | ||||
|                             Err(_) => write!(f, "    {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?, | ||||
|                         }; | ||||
|                     }, | ||||
|                     AttrMeta::Utf16 => quote! { | ||||
|                         match String::from_utf16(&self.#name) { | ||||
|                             Ok(v) => write!(f, "    {} [utf16; {}]: {:?}\n", #ident_str, #len, v)?, | ||||
|                             Err(_) => write!(f, "    {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?, | ||||
|                         }; | ||||
|                     }, | ||||
|                     AttrMeta::NoDebug => quote! { | ||||
|                         write!(f, "    {} [{}; {}]: [...]\n", #ident_str, #type_str, #len)?; | ||||
|                     }, | ||||
|                     _ => quote! { | ||||
|                         write!(f, "    {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?; | ||||
|                     }, | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|         dbg_write.push(element); | ||||
|     } | ||||
|         }) | ||||
|         .collect::<Vec<_>>(); | ||||
| 
 | ||||
|     let name_str = name.to_string(); | ||||
|     quote! { | ||||
|         impl std::fmt::Debug for #name { | ||||
|             fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { | ||||
|                 write!(f, "{} {{\n", #name_str)?; | ||||
|                 #(#dbg_write)* | ||||
|                 write!(f, "}}") | ||||
|                 f.debug_struct(#name_str) | ||||
|                     #(#dbg_write)* | ||||
|                 .finish() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user