|
|
@ -205,18 +205,19 @@ 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 {
|
|
|
|
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! {
|
|
|
|
write!(f, " {} {}: [...]\n", #ident_str, #type_str)?;
|
|
|
|
.field(&format!("{} [{}]", #ident_str, #type_str), &format_args!("[...]"))
|
|
|
|
},
|
|
|
|
_ => quote! {
|
|
|
|
write!(f, " {} {}: {:?}\n", #ident_str, #type_str, self.#name)?;
|
|
|
|
.field(&format!("{} [{}]", #ident_str, #type_str), &self.#name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
@ -225,35 +226,38 @@ fn generate_debug_impl(name: syn::Ident, attrs: &Vec<AttrType>) -> proc_macro2:: |
|
|
|
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(v) => write!(f, " {} [utf8; {}]: {:?}\n", #ident_str, #len, v)?,
|
|
|
|
Err(_) => write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?,
|
|
|
|
};
|
|
|
|
Ok(ref s) => s,
|
|
|
|
Err(_) => &self.#name
|
|
|
|
})
|
|
|
|
},
|
|
|
|
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())?,
|
|
|
|
};
|
|
|
|
.field(&format!("{} [utf16; {}]", #ident_str, #len),
|
|
|
|
match std::str::from_utf16(&self.#name) {
|
|
|
|
Ok(ref s) => s,
|
|
|
|
Err(_) => &self.#name
|
|
|
|
})
|
|
|
|
},
|
|
|
|
AttrMeta::NoDebug => quote! {
|
|
|
|
write!(f, " {} [{}; {}]: [...]\n", #ident_str, #type_str, #len)?;
|
|
|
|
.field(&format!("{} [{}; {}]", #ident_str, #type_str, #len), &format_args!("[...]"))
|
|
|
|
},
|
|
|
|
_ => quote! {
|
|
|
|
write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?;
|
|
|
|
},
|
|
|
|
.field(&format!("{} [{}; {}]", #ident_str, #type_str, #len), &format_args!("{:?}", &self.#name))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
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)?;
|
|
|
|
f.debug_struct(#name_str)
|
|
|
|
#(#dbg_write)*
|
|
|
|
write!(f, "}}")
|
|
|
|
.finish()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|