limnus_macros/
lib.rs

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/limnus
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 */
extern crate proc_macro;

use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};

#[proc_macro_derive(Resource)]
pub fn resource_derive(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let name = &input.ident;
    let generics = &input.generics;

    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    let expanded = quote! {
        impl #impl_generics Resource for #name #ty_generics #where_clause {
        }

        // TODO: Make sure type do not support Copy or Clone
        // TODO: Should be a conf to have this as an option
        // impl !Clone for #name {}
        // impl !Copy for #name {}
    };

    TokenStream::from(expanded)
}

#[proc_macro_derive(LocalResource)]
pub fn local_resource_derive(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let name = &input.ident;
    let generics = &input.generics;

    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    let expanded = quote! {
        impl #impl_generics LocalResource for #name #ty_generics #where_clause {
        }

        // TODO: Make sure type do not support Copy or Clone
        // TODO: Should be a conf to have this as an option
        // impl !Clone for #name {}
        // impl !Copy for #name {}
    };

    TokenStream::from(expanded)
}

#[proc_macro_derive(Message)]
pub fn message_derive(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let name = &input.ident;
    let generics = &input.generics;

    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    let expanded = quote! {
        impl #impl_generics Message for #name #ty_generics #where_clause {
        }

        // TODO: Make sure type do not support Copy or Clone
        // TODO: Should be a conf to have this as an option
        // impl !Clone for #name {}
        // impl !Copy for #name {}
        impl #impl_generics #name #ty_generics #where_clause {
            #[doc(hidden)]
            const __PREVENT_COPY_CLONE: () = {
                let _marker: std::marker::PhantomData<*const ()> = std::marker::PhantomData;
            };
        }

    };

    TokenStream::from(expanded)
}

#[proc_macro_derive(Asset)]
pub fn asset_derive(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let name = &input.ident;
    let generics = &input.generics;

    let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

    let expanded = quote! {
        impl #impl_generics Asset for #name #ty_generics #where_clause {
        }

        // TODO: Make sure type do not support Copy or Clone
        // TODO: Should be a conf to have this as an option
        // impl !Clone for #name {}
        // impl !Copy for #name {}
    };

    TokenStream::from(expanded)
}