codama-attributes 0.13.2

Codama attributes definitions and parsers
Documentation
use crate::utils::FromMeta;
use codama_nodes::{AmountNumberDisplayNode, DateTimeNumberDisplayNode, NumberDisplayNode};
use codama_syn_helpers::{extensions::*, Meta};

impl FromMeta for NumberDisplayNode {
    fn from_meta(meta: &Meta) -> syn::Result<Self> {
        match meta.path_str().as_str() {
            "amount" => AmountNumberDisplayNode::from_meta(meta).map(Self::Amount),
            "date_time" => DateTimeNumberDisplayNode::from_meta(meta).map(Self::DateTime),
            "duration" => Err(meta.error("duration display is not supported yet")),
            "injected" => Err(meta.error("injected display values are not supported yet")),
            _ => Err(meta.error("unrecognized number display")),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn parses_supported_displays() {
        let amount: Meta = syn::parse_quote! { amount(decimals = 9, unit = "SOL") };
        assert!(matches!(
            NumberDisplayNode::from_meta(&amount).unwrap(),
            NumberDisplayNode::Amount(_)
        ));

        let date_time: Meta = syn::parse_quote! { date_time };
        assert!(matches!(
            NumberDisplayNode::from_meta(&date_time).unwrap(),
            NumberDisplayNode::DateTime(_)
        ));
    }

    #[test]
    fn rejects_unsupported_displays() {
        let duration: Meta = syn::parse_quote! { duration };
        assert_eq!(
            NumberDisplayNode::from_meta(&duration)
                .unwrap_err()
                .to_string(),
            "duration display is not supported yet"
        );

        let string: Meta = syn::parse_quote! { string };
        assert_eq!(
            NumberDisplayNode::from_meta(&string)
                .unwrap_err()
                .to_string(),
            "unrecognized number display"
        );

        let injected: Meta = syn::parse_quote! { injected("decimals") };
        assert_eq!(
            NumberDisplayNode::from_meta(&injected)
                .unwrap_err()
                .to_string(),
            "injected display values are not supported yet"
        );
    }
}