implement nodebug for specific vars
This commit is contained in:
parent
5d627e9219
commit
ea488cadca
@ -11,8 +11,9 @@ use quote::quote;
|
||||
|
||||
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, PartialEq)]
|
||||
enum AttrMeta {
|
||||
None,
|
||||
Utf8,
|
||||
Utf16,
|
||||
NoDebug,
|
||||
@ -22,8 +23,8 @@ enum AttrMeta {
|
||||
|
||||
#[derive(Debug)]
|
||||
enum AttrType {
|
||||
Value(syn::PathSegment, syn::Ident, Option<AttrMeta>),
|
||||
Array(syn::PathSegment, syn::Ident, usize, Option<AttrMeta>),
|
||||
Value(syn::PathSegment, syn::Ident, AttrMeta),
|
||||
Array(syn::PathSegment, syn::Ident, usize, AttrMeta)
|
||||
}
|
||||
|
||||
fn generate_struct_def(name: syn::Ident, attrs: &Vec<AttrType>) -> proc_macro2::TokenStream {
|
||||
@ -196,40 +197,41 @@ fn generate_debug_impl(name: syn::Ident, attrs: &Vec<AttrType>) -> proc_macro2::
|
||||
let mut dbg_write = Vec::new();
|
||||
for attr in attrs {
|
||||
let element = match attr {
|
||||
AttrType::Value(ty, name, _meta) => {
|
||||
AttrType::Value(ty, name, meta) => {
|
||||
let ident_str = name.to_string();
|
||||
let type_str = ty.ident.to_string();
|
||||
quote! {
|
||||
write!(f, " {} {}: {:?}\n", #ident_str, #type_str, self.#name)?;
|
||||
match meta {
|
||||
AttrMeta::NoDebug => quote! {
|
||||
write!(f, " {} {}: [...]\n", #ident_str, #type_str)?;
|
||||
},
|
||||
_ => quote! {
|
||||
write!(f, " {} {}: {:?}\n", #ident_str, #type_str, self.#name)?;
|
||||
}
|
||||
}
|
||||
},
|
||||
AttrType::Array(ty, name, len, meta) => {
|
||||
let ident_str = name.to_string();
|
||||
let type_str = ty.ident.to_string();
|
||||
if let Some(meta) = meta {
|
||||
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())?,
|
||||
};
|
||||
}
|
||||
},
|
||||
_ => quote! { write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?; }
|
||||
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)?;
|
||||
},
|
||||
AttrMeta::None => quote! {
|
||||
write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?;
|
||||
}
|
||||
}
|
||||
else {
|
||||
quote! { write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?; }
|
||||
}
|
||||
}
|
||||
};
|
||||
dbg_write.push(element);
|
||||
@ -285,9 +287,6 @@ pub fn pso_packet2(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
let args = parse_macro_input!(attr as syn::AttributeArgs);
|
||||
let mut cmd = 0;
|
||||
let mut flag = true;
|
||||
let mut debug = true;
|
||||
let mut from_bytes = true;
|
||||
let mut as_bytes = true;
|
||||
for a in args {
|
||||
match &a {
|
||||
NestedMeta::Lit(lit) => {
|
||||
@ -299,9 +298,6 @@ pub fn pso_packet2(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
if let syn::Meta::Path(syn::Path {segments, ..}) = k {
|
||||
match segments[0].ident.to_string().as_str() {
|
||||
"no_flag" => flag = false,
|
||||
"no_debug" => debug = false,
|
||||
"no_from" => from_bytes = false,
|
||||
"no_as" => as_bytes = false,
|
||||
_ => {
|
||||
return syn::Error::new(segments[0].ident.span(), "unknown macro param").to_compile_error().into();
|
||||
}
|
||||
@ -319,13 +315,13 @@ pub fn pso_packet2(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
if must_be_last {
|
||||
return syn::Error::new(field.ident.as_ref().unwrap().span(), "variables can not follow Vec or String").to_compile_error().into();
|
||||
}
|
||||
let mut attr_meta = None;
|
||||
let mut attr_meta = AttrMeta::None;
|
||||
for attr in &field.attrs {
|
||||
attr_meta = match attr.path.segments[0].ident.to_string().as_str() {
|
||||
"utf8" => Some(AttrMeta::Utf8),
|
||||
"utf16" => Some(AttrMeta::Utf16),
|
||||
"nodebug" => Some(AttrMeta::NoDebug),
|
||||
_ => None
|
||||
"utf8" => AttrMeta::Utf8,
|
||||
"utf16" => AttrMeta::Utf16,
|
||||
"nodebug" => AttrMeta::NoDebug,
|
||||
_ => AttrMeta::None
|
||||
}
|
||||
}
|
||||
match &field.ty {
|
||||
|
Loading…
x
Reference in New Issue
Block a user