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
101
102
103
104
105
//! Script macros
//! 
//! The script macros are in here because of an attempt to pass a dyn GameObject.


// Generalized
// #[macro_export]
// macro_rules! dyn_async {(
//     $( #[$attr:meta] )*
//     $pub:vis
//     async
//     fn $fname:ident<$lt:lifetime> ( $($args:tt)* ) $(-> $Ret:ty)?
//     {
//         $($body:tt)*
//     }
// ) => (
//     $( #[$attr] )*
//     #[allow(unused_parens)]
//     $pub
//     fn $fname<$lt> ( $($args)* ) -> ::std::pin::Pin<::std::boxed::Box<
//         dyn ::std::future::Future<Output = ($($Ret)?)>
//             + ::std::marker::Send + $lt
//     >>
//     {
//         ::std::boxed::Box::pin(async move { $($body)* })
//     }
// )}

#[macro_export]
macro_rules! start_script {
    (
        $( #[$attr:meta] )*
        $pub:vis
        async
        fn start<$lt:lifetime> ($this:tt : $this_ty:ty, $engine_globals:tt : $engine_globals_ty:ty) -> Swap
        {
            $($body:tt)*
        }
    ) => (
        $( #[$attr] )*
        #[allow(unused_parens)]
        $pub
        fn start<$lt> ($this : $this_ty, $engine_globals : $engine_globals_ty) -> ::std::pin::Pin<::std::boxed::Box<
            dyn ::std::future::Future<Output = Swap>
                + ::std::marker::Send + $lt
        >>
        {
            ::std::boxed::Box::pin(async move { 
                $($body)*
            })
        }
    )
}

#[macro_export]
macro_rules! frame_script {
    (
        $( #[$attr:meta] )*
        $pub:vis
        async
        fn frame<$lt:lifetime> ($this:tt : $this_ty:ty , $engine_globals:tt : $engine_globals_ty:ty) -> Swap
        {
            $($body:tt)*
        }
    ) => (
        $( #[$attr] )*
        #[allow(unused_parens)]
        $pub
        fn frame<$lt> ($this : $this_ty, $engine_globals : $engine_globals_ty) -> ::std::pin::Pin<::std::boxed::Box<
            dyn ::std::future::Future<Output = Swap>
                + ::std::marker::Send + $lt
        >>
        {
            ::std::boxed::Box::pin(async move { 
                $($body)*
            })
        }
    )
}

#[macro_export]
macro_rules! event_handler {
    (
        $( #[$attr:meta] )*
        $pub:vis
        async
        fn event_handler<$lt:lifetime> ($this:tt : $this_ty:ty , $engine_globals:tt : $engine_globals_ty:ty, $event:tt : $event_ty:ty) -> Swap
        {
            $($body:tt)*
        }
    ) => (
        $( #[$attr] )*
        #[allow(unused_parens)]
        $pub
        fn event_handler<$lt> ($this : $this_ty, $engine_globals : $engine_globals_ty, $event: $event_ty) -> ::std::pin::Pin<::std::boxed::Box<
            dyn ::std::future::Future<Output = Swap>
                + ::std::marker::Send + $lt
        >>
        {
            ::std::boxed::Box::pin(async move { 
                $($body)*
            })
        }
    )
}