fn parse()

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
    }