in quic/s2n-quic-events/src/parser.rs [549:604]
fn parse(attrs: Vec<syn::Attribute>) -> Self {
let mut v = Self {
// events must include a name to be considered an event
event_name: None,
deprecated: TokenStream::default(),
allow_deprecated: TokenStream::default(),
// most event subjects relate to actual connections so make that the default
subject: Subject::Connection,
// default to #[non_exhaustive]
exhaustive: false,
derive: true,
derive_attrs: quote!(),
builder_derive: false,
builder_derive_attrs: quote!(),
checkpoint: vec![],
measure_counter: vec![],
extra: quote!(),
};
for attr in attrs {
let path = attr.path();
if path.is_ident("event") {
v.event_name = Some(attr.parse_args().unwrap());
} else if path.is_ident("deprecated") {
attr.to_tokens(&mut v.deprecated);
if v.allow_deprecated.is_empty() {
v.allow_deprecated = quote!(#[allow(deprecated)]);
}
} else if path.is_ident("subject") {
v.subject = attr.parse_args().unwrap();
} else if path.is_ident("exhaustive") {
v.exhaustive = true;
} else if path.is_ident("derive") {
v.derive = false;
attr.to_tokens(&mut v.derive_attrs);
} else if path.is_ident("builder_derive") {
v.builder_derive = true;
if let Meta::List(list) = attr.parse_args().unwrap() {
list.to_tokens(&mut v.builder_derive_attrs);
}
} else if path.is_ident("checkpoint") {
v.checkpoint.push(attr.parse_args().unwrap());
} else if path.is_ident("measure_counter") {
v.measure_counter.push(attr.parse_args().unwrap());
} else {
attr.to_tokens(&mut v.extra)
}
}
if !(v.checkpoint.is_empty() && v.measure_counter.is_empty()) {
assert_eq!(v.subject, Subject::Connection);
}
v
}