#attributes #proc-macro-attributes #proc-macro #dynamic

vectorize_struct

vectorize_struct adds an procedural macro attribute that makes it possible to iterate over Trait Objects of every field of a Struct that implements a specific trait

4 releases

Uses old Rust 2015

0.1.3 Sep 25, 2018
0.1.2 Sep 24, 2018
0.1.1 Sep 24, 2018
0.1.0 Sep 24, 2018

#42 in #proc-macro-attributes

MIT license

9KB
94 lines

vectorize_struct adds an procedural macro attribute that makes it possible to iterate over Trait Objects of every field of a Struct that implements a specific trait.

It only works on nightly and requires #![feature(specialization)].

Example

#![feature(specialization)]

extern crate vectorize_struct;
use vectorize_struct::vectorize_struct;

use std::fmt::{Debug, Display};

#[vectorize_struct(std::fmt::Display, Debug)]
struct Struct {
    i: i32,
    u: u32,
    b: bool,
    s: String,
    buui: (bool, u32, u8, i16),
    s2: String,
    nd: NoDisplay,
}

struct NoDisplay {}

fn main() {
    use vectorized_Struct::*;

    let s = Struct {
        i: -12,
        u: 61,
        b: false,
        s: String::from("asd"),
        buui: (true, 1, 5, -2),
        s2: String::from("fgh"),
        nd: NoDisplay {},
    };

    for (name, field) in s.vectorize() as Vec<(Fields, Option<&Display>)> {
        if let Some(field) = field {
            println!("{:?} can display: {}", name, field);
        }
    }

    for (name, field) in s.vectorize() as Vec<(Fields, Option<&Debug>)> {
        if let Some(field) = field {
            println!("{:?} can debug: {:?}", name, field);
        }
    }
}

Dependencies

~2MB
~48K SLoC