1
- use bevy_macro_utils:: Symbol ;
1
+ use bevy_macro_utils:: { get_lit_str , Symbol } ;
2
2
use proc_macro:: TokenStream ;
3
3
use quote:: { quote, ToTokens } ;
4
4
use syn:: { parse_macro_input, parse_quote, DeriveInput , Error , Path , Result } ;
@@ -17,39 +17,72 @@ pub fn derive_event(input: TokenStream) -> TokenStream {
17
17
Err ( e) => return e. into_compile_error ( ) . into ( ) ,
18
18
} ;
19
19
20
- let warn_missed = attrs. warn_missed ;
20
+ let missed = attrs. missed ;
21
+
22
+ let warn_missed = match missed {
23
+ Missed :: Ignore => quote ! { const WARN_MISSED : bool = false ; } ,
24
+ Missed :: DebugWarn => quote ! {
25
+ #[ cfg( debug_assertions) ]
26
+ const WARN_MISSED : bool = true ;
27
+ #[ cfg( not( debug_assertions) ) ]
28
+ const WARN_MISSED : bool = false ;
29
+ } ,
30
+ Missed :: Warn => quote ! { const WARN_MISSED : bool = true ; } ,
31
+ } ;
21
32
22
33
let struct_name = & ast. ident ;
23
34
let ( impl_generics, type_generics, where_clause) = & ast. generics . split_for_impl ( ) ;
24
35
25
36
TokenStream :: from ( quote ! {
26
37
impl #impl_generics #bevy_ecs_path:: event:: Event for #struct_name #type_generics #where_clause {
27
- const WARN_MISSED : bool = #warn_missed;
38
+ #warn_missed
28
39
}
29
40
} )
30
41
}
31
42
32
43
struct Attrs {
33
- warn_missed : bool ,
44
+ missed : Missed ,
45
+ }
46
+
47
+ enum Missed {
48
+ Ignore ,
49
+ DebugWarn ,
50
+ Warn ,
34
51
}
35
52
36
53
pub const EVENT : Symbol = Symbol ( "event" ) ;
37
- pub const WARN_MISSED : & str = "warn_missed" ;
54
+ pub const MISSED : Symbol = Symbol ( "missed" ) ;
55
+
56
+ const IGNORE : & str = "ignore" ;
57
+ const DEBUG_WARN : & str = "debug_warn" ;
58
+ const WARN : & str = "warn" ;
38
59
39
60
fn parse_event_attr ( ast : & DeriveInput ) -> Result < Attrs > {
40
61
let meta_items = bevy_macro_utils:: parse_attrs ( ast, EVENT ) ?;
41
62
42
- let mut attrs = Attrs { warn_missed : false } ;
63
+ let mut attrs = Attrs {
64
+ missed : Missed :: DebugWarn ,
65
+ } ;
43
66
44
67
for meta in meta_items {
45
68
use syn:: {
46
- Meta :: Path ,
69
+ Meta :: NameValue ,
47
70
NestedMeta :: { Lit , Meta } ,
48
71
} ;
49
72
match meta {
50
- Meta ( Path ( m) ) => {
51
- if m. is_ident ( WARN_MISSED ) {
52
- attrs. warn_missed = true ;
73
+ Meta ( NameValue ( m) ) if m. path == MISSED => {
74
+ attrs. missed = match get_lit_str ( MISSED , & m. lit ) ?. value ( ) . as_str ( ) {
75
+ IGNORE => Missed :: Ignore ,
76
+ DEBUG_WARN => Missed :: DebugWarn ,
77
+ WARN => Missed :: Warn ,
78
+ e => {
79
+ return Err ( Error :: new_spanned (
80
+ m. lit ,
81
+ format ! (
82
+ "Invalid missed event behaviour `{e}`, expected '{IGNORE}', '{DEBUG_WARN}', or '{WARN}'." ,
83
+ ) ,
84
+ ) )
85
+ }
53
86
}
54
87
}
55
88
Meta ( meta_item) => {
0 commit comments