pub trait CapSet: Send + Sync + 'static {
fn initialize<Caps: CapSet>(app: &mut bevy_app::App, cap_req: &mut ImmCapAccessRequests<Caps>);
}
pub trait ImmCapability: Send + Sync + 'static {
fn build<Caps: CapSet>(app: &mut bevy_app::App, cap_req: &mut ImmCapAccessRequests<Caps>);
}
pub trait ImplCap<T>: CapSet {}
#[macro_export]
macro_rules! impl_capability_set {
($name:ty, $set_trait:ident > $subset_check:ident, ($($t:ty),+ $(,)?)) => {
impl $crate::CapSet for $name {
fn initialize<Caps: $crate::CapSet>(
app: &mut $crate::bevy_app::App,
cap_req: &mut $crate::ImmCapAccessRequests<Caps>,
) {
$(<$t as $crate::ImmCapability>::build(app, cap_req);)+
}
}
#[doc = "Trait to check for set of capabilities to be implemented"]
pub trait $set_trait: $crate::CapSet $(+ $crate::ImplCap<$t>)+ {}
impl<T> $set_trait for T
where T: $crate::CapSet $(+ $crate::ImplCap<$t>)+
{}
$(
impl $crate::ImplCap<$t> for $name {}
)+
$crate::paste::paste!{
#[allow(warnings)]
fn [<_subset_check_for $set_trait>]<T: $subset_check>() {}
#[allow(warnings)]
fn [< _check_ $set_trait _implements_at_least_provided_subset $subset_check >]() {
[<_subset_check_for $set_trait>]::<$name>();
}
}
};
}
impl CapSet for () {
fn initialize<Caps: CapSet>(
_app: &mut bevy_app::App,
_cap_req: &mut ImmCapAccessRequests<Caps>,
) {
}
}
pub trait ImplCapsEmpty: CapSet {}
impl<T: CapSet> ImplCapsEmpty for T {}
impl<T: CapSet> ImplCap<()> for T {}
impl ImmCapability for () {
fn build<Caps: CapSet>(_app: &mut bevy_app::App, _cap_req: &mut ImmCapAccessRequests<Caps>) {}
}
mod access_requests;
pub use access_requests::{ImmCapAccessRequests, ImmCapAccessRequestsResource};
mod system_param;
pub use system_param::{ImmCapQueryParam, ImmCapResourcesParam};