enum-helper-derive 0.2.1

Procedural macro implementation for enum-helper
Documentation
use quote::ToTokens as _;

use crate::{
    attr::{Attr as _, AttrBool},
    ctxt::Ctxt,
};

pub struct VariantAttr {
    pub skip: AttrBool,
}

impl VariantAttr {
    pub fn from_attrs(cx: &Ctxt, attrs: &[syn::Attribute]) -> Self {
        use crate::symbol::*;

        let mut ret = Self {
            skip: AttrBool::new(ENUM_ALL, SKIP),
        };

        for attr in attrs {
            if attr.path() != ENUM_ALL {
                continue;
            }

            if let syn::Meta::List(meta) = &attr.meta {
                if meta.tokens.is_empty() {
                    continue;
                }
            }

            let res = attr.parse_nested_meta(|meta| {
                if meta.path == ret.skip.name() {
                    ret.skip.try_from_meta(cx, &meta);
                } else {
                    let path = meta.path.to_token_stream().to_string().replace(' ', "");
                    let msg = format!("unknown {} variant attribute `{}`", ENUM_ALL, path);
                    return Err(meta.error(msg));
                };

                Ok(())
            });

            if let Err(err) = res {
                cx.syn_error(err);
            }
        }

        ret
    }
}