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 {
|
enum AttrMeta {
|
||||||
|
None,
|
||||||
Utf8,
|
Utf8,
|
||||||
Utf16,
|
Utf16,
|
||||||
NoDebug,
|
NoDebug,
|
||||||
@ -22,8 +23,8 @@ enum AttrMeta {
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum AttrType {
|
enum AttrType {
|
||||||
Value(syn::PathSegment, syn::Ident, Option<AttrMeta>),
|
Value(syn::PathSegment, syn::Ident, AttrMeta),
|
||||||
Array(syn::PathSegment, syn::Ident, usize, Option<AttrMeta>),
|
Array(syn::PathSegment, syn::Ident, usize, AttrMeta)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_struct_def(name: syn::Ident, attrs: &Vec<AttrType>) -> proc_macro2::TokenStream {
|
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();
|
let mut dbg_write = Vec::new();
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
let element = match attr {
|
let element = match attr {
|
||||||
AttrType::Value(ty, name, _meta) => {
|
AttrType::Value(ty, name, meta) => {
|
||||||
let ident_str = name.to_string();
|
let ident_str = name.to_string();
|
||||||
let type_str = ty.ident.to_string();
|
let type_str = ty.ident.to_string();
|
||||||
quote! {
|
match meta {
|
||||||
|
AttrMeta::NoDebug => quote! {
|
||||||
|
write!(f, " {} {}: [...]\n", #ident_str, #type_str)?;
|
||||||
|
},
|
||||||
|
_ => quote! {
|
||||||
write!(f, " {} {}: {:?}\n", #ident_str, #type_str, self.#name)?;
|
write!(f, " {} {}: {:?}\n", #ident_str, #type_str, self.#name)?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
AttrType::Array(ty, name, len, meta) => {
|
AttrType::Array(ty, name, len, meta) => {
|
||||||
let ident_str = name.to_string();
|
let ident_str = name.to_string();
|
||||||
let type_str = ty.ident.to_string();
|
let type_str = ty.ident.to_string();
|
||||||
if let Some(meta) = meta {
|
|
||||||
match meta {
|
match meta {
|
||||||
AttrMeta::Utf8 => {
|
AttrMeta::Utf8 => quote! {
|
||||||
quote! {
|
|
||||||
match std::str::from_utf8(&self.#name) {
|
match std::str::from_utf8(&self.#name) {
|
||||||
Ok(v) => write!(f, " {} [utf8; {}]: {:?}\n", #ident_str, #len, v)?,
|
Ok(v) => write!(f, " {} [utf8; {}]: {:?}\n", #ident_str, #len, v)?,
|
||||||
Err(_) => write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?,
|
Err(_) => write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?,
|
||||||
};
|
};
|
||||||
}
|
|
||||||
},
|
},
|
||||||
AttrMeta::Utf16 => {
|
AttrMeta::Utf16 => quote! {
|
||||||
quote! {
|
|
||||||
match String::from_utf16(&self.#name) {
|
match String::from_utf16(&self.#name) {
|
||||||
Ok(v) => write!(f, " {} [utf16; {}]: {:?}\n", #ident_str, #len, v)?,
|
Ok(v) => write!(f, " {} [utf16; {}]: {:?}\n", #ident_str, #len, v)?,
|
||||||
Err(_) => write!(f, " {} [{}; {}]: {:?}\n", #ident_str, #type_str, #len, self.#name.to_vec())?,
|
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())?; }
|
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);
|
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 args = parse_macro_input!(attr as syn::AttributeArgs);
|
||||||
let mut cmd = 0;
|
let mut cmd = 0;
|
||||||
let mut flag = true;
|
let mut flag = true;
|
||||||
let mut debug = true;
|
|
||||||
let mut from_bytes = true;
|
|
||||||
let mut as_bytes = true;
|
|
||||||
for a in args {
|
for a in args {
|
||||||
match &a {
|
match &a {
|
||||||
NestedMeta::Lit(lit) => {
|
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 {
|
if let syn::Meta::Path(syn::Path {segments, ..}) = k {
|
||||||
match segments[0].ident.to_string().as_str() {
|
match segments[0].ident.to_string().as_str() {
|
||||||
"no_flag" => flag = false,
|
"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();
|
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 {
|
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();
|
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 {
|
for attr in &field.attrs {
|
||||||
attr_meta = match attr.path.segments[0].ident.to_string().as_str() {
|
attr_meta = match attr.path.segments[0].ident.to_string().as_str() {
|
||||||
"utf8" => Some(AttrMeta::Utf8),
|
"utf8" => AttrMeta::Utf8,
|
||||||
"utf16" => Some(AttrMeta::Utf16),
|
"utf16" => AttrMeta::Utf16,
|
||||||
"nodebug" => Some(AttrMeta::NoDebug),
|
"nodebug" => AttrMeta::NoDebug,
|
||||||
_ => None
|
_ => AttrMeta::None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match &field.ty {
|
match &field.ty {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user