6 releases (3 breaking)

0.4.2 Jan 22, 2020
0.4.1 Dec 26, 2019
0.3.0 Jul 9, 2019
0.2.1 Jul 9, 2019
0.1.1 Oct 30, 2018

#1115 in Procedural macros

Download history 3277/week @ 2023-12-06 3698/week @ 2023-12-13 4226/week @ 2023-12-20 2081/week @ 2023-12-27 3938/week @ 2024-01-03 4664/week @ 2024-01-10 4973/week @ 2024-01-17 4312/week @ 2024-01-24 4114/week @ 2024-01-31 3342/week @ 2024-02-07 5300/week @ 2024-02-14 4989/week @ 2024-02-21 4723/week @ 2024-02-28 3706/week @ 2024-03-06 4846/week @ 2024-03-13 3304/week @ 2024-03-20

17,686 downloads per month
Used in 9 crates (4 directly)

MIT/Apache

18KB
376 lines

Build Status

Helper APIs for Rust procedural macros

This crates provides helper APIs for procedural macros. Please read the API documentation on docs.rs

APIs to manipulate with attributes

use proc_macro2::Span;
use syn::LitStr;

fn lit_str(s: &str) -> Lit {
    Lit::Str(LitStr::new(s, Span::call_site()))
}

fn test_contains_attribute_impl() {
    let attr: Attribute = parse_quote!(#[level0(level1, level1_1(level2, level2_1 = "hello"))]);
    let attr = [attr];

    assert!(!contains_attribute(&attr, &[]));

    assert!(!contains_attribute(&attr, &["not"]));

    assert!(!contains_attribute(&attr, &["level0"]));

    assert!(contains_attribute(&attr, &["level0", "level1"]));

    assert!(!contains_attribute(&attr, &["level0", "level1_1"]),);

    assert!(contains_attribute(&attr, &["level0", "level1_1", "level2"]),);

    assert!(!contains_attribute(
        &attr,
        &["level0", "level1_1", "level2_1"]
    ),);
}

#[test]
fn test_get_attribute_value() {
    let attr: Attribute = parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]);
    let attr = [attr];

    assert_eq!(get_attribute_value(&attr, &[""]), None);

    assert_eq!(get_attribute_value(&attr, &["not"]), None);

    assert_eq!(get_attribute_value(&attr, &["level0"]), None);

    assert_eq!(
        get_attribute_value(&attr, &["level0", "level1"]),
        Some(lit_str("hi"))
    );

    assert_eq!(get_attribute_value(&attr, &["level0", "level1_1"]), None);

    assert_eq!(
        get_attribute_value(&attr, &["level0", "level1_1", "level2"]),
        Some(lit_str("bye"))
    );
}

#[test]
fn test_get_attribute_map() {
    assert_eq!(
        get_attribute_map(
            &[
                parse_quote!(#[level9]),
                parse_quote!(#[level0(level8)]),
                parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]),
                parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]),
                parse_quote!(#[gen0(gen1 = "amoeba", gen1_1 = "monad", gen1_2(gen2 = "monoid"))])
            ],
            "."
        ),
        vec![
            ("level9".to_string(), vec![]),
            ("level0.level8".to_string(), vec![]),
            (
                "level0.level1".to_string(),
                vec![lit_str("hi"), lit_str("hi")],
            ),
            (
                "level0.level1_1.level2".to_string(),
                vec![lit_str("bye"), lit_str("bye")],
            ),
            ("gen0.gen1".to_string(), vec![lit_str("amoeba")]),
            ("gen0.gen1_1".to_string(), vec![lit_str("monad")]),
            ("gen0.gen1_2.gen2".to_string(), vec![lit_str("monoid")]),
        ]
        .into_iter()
        .collect()
    );
}

Dependencies

~1.5MB
~34K SLoC