bevy_trait 0.3.3

Macros for creating Traits in Bevy
Documentation
use bevy::prelude::*;
use bevy_trait::*;

trait Initializable {
    #[system]
    fn init();

    #[system]
    fn empty() {}

    #[system]
    fn default(_entities: Query<Entity>) {
        let _a = 25;
    }

    #[system]
    fn generic<C: Component>();

    #[system]
    fn needs_build(data: i32);

    #[system]
    fn build_generic<C: Component + std::fmt::Debug>(component: C);

    fn desugared_system() -> impl System;

    fn desugared_boxed_system() -> bevy::ecs::system::BoxedSystem;
}

struct Cactus;

impl Initializable for Cactus {
    #[system]
    fn init(_transforms: Query<&Transform>) {
        info!("Init!");
    }

    #[system]
    fn generic<C: Component>(_query: Query<&C>) {}

    #[system(data: i32)]
    fn needs_build(query: Query<&Transform, With<Visibility>>) {
        info!("Data: {:?}", data);

        for tf in &query {
            info!("Transform {:?}", tf);
        }
    }

    #[system(component: C)]
    fn build_generic<C: Component + std::fmt::Debug>(query: Query<&C>) {
        info!("Component: {:?}", component);

        for other in &query {
            info!("Other: {:?}", other);
        }
    }

    fn desugared_system() -> impl System {
        bevy::ecs::system::IntoSystem::into_system(|tfs: Query<&Transform>| {
            for tf in &tfs {
                info!("Transform {:?}", tf)
            }
        })
    }

    fn desugared_boxed_system() -> bevy::ecs::system::BoxedSystem {
        Box::new(bevy::ecs::system::IntoSystem::into_system(
            |tfs: Query<&Transform>| {
                for tf in &tfs {
                    info!("Transform {:?}", tf)
                }
            },
        ))
    }
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, Cactus::init())
        .add_systems(
            Update,
            (Cactus::needs_build(100), Cactus::generic::<Transform>()),
        )
        .run();
}