codama-attributes 0.13.1

Codama attributes definitions and parsers
Documentation
use crate::utils::{FromMeta, SetOnce};
use codama_nodes::{NestedTypeNode, NumberTypeNode, PrefixedCountNode, TypeNode};
use codama_syn_helpers::{extensions::*, Meta};

impl FromMeta for PrefixedCountNode {
    fn from_meta(meta: &Meta) -> syn::Result<Self> {
        let pl = meta.assert_directive("prefixed_count")?.as_path_list()?;
        let mut prefix: SetOnce<NestedTypeNode<NumberTypeNode>> = SetOnce::new("prefix");

        pl.each(|ref meta| match meta.path_str().as_str() {
            "prefix" => prefix.set(parse_prefix(meta.as_value()?)?, meta),
            _ => {
                if meta.is_path_or_list() {
                    return prefix.set(parse_prefix(meta)?, meta);
                }
                Err(meta.error("unrecognized attribute"))
            }
        })?;

        Ok(PrefixedCountNode::new(prefix.take(meta)?))
    }
}

fn parse_prefix(meta: &Meta) -> syn::Result<NestedTypeNode<NumberTypeNode>> {
    let node = TypeNode::from_meta(meta)?;
    NestedTypeNode::<NumberTypeNode>::try_from(node)
        .map_err(|_| meta.error("prefix must be a NumberTypeNode"))
}