1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
extern crate proc_macro;

mod descriptors;
mod repr;
mod stage;

#[proc_macro_attribute]
pub fn descriptors(
    attr: proc_macro::TokenStream,
    item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    descriptors::descriptors(attr, item).into()
}

#[proc_macro_attribute]
pub fn shader_repr(
    attr: proc_macro::TokenStream,
    item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    repr::shader_repr(attr, item).into()
}

fn find_unique<I>(iter: I, msg: &'static str) -> Option<I::Item>
where
    I: IntoIterator,
{
    let mut iter = iter.into_iter();
    let item = iter.next()?;
    if iter.next().is_some() {
        panic!("{}", msg);
    }
    Some(item)
}

fn get_unique<I>(iter: I, msg: &'static str) -> I::Item
where
    I: IntoIterator,
{
    let mut iter = iter.into_iter();
    let item = iter.next().expect(msg);
    if iter.next().is_some() {
        panic!("{}", msg);
    }
    item
}