diff options
| -rw-r--r-- | engine-ecs/src/pair.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/engine-ecs/src/pair.rs b/engine-ecs/src/pair.rs index eff0332..cede364 100644 --- a/engine-ecs/src/pair.rs +++ b/engine-ecs/src/pair.rs @@ -680,6 +680,79 @@ impl ComponentOrWildcard for Wildcard impl sealed::Sealed for Wildcard {} +#[macro_export] +macro_rules! pair { + ($relation: ty, $target: ty) => { + $crate::pair!(@build, $relation, $target) + }; + + ($relation: ty, { $target: expr }) => { + $crate::pair!(@build, $relation, { $target }) + }; + + ({ $relation: expr }, $target: ty) => { + $crate::pair!(@build, { $relation }, $target) + }; + + ({ $relation: expr }, { $target: expr }) => { + $crate::pair!(@build, { $relation }, { $target }) + }; + + ($relation: ty, ={ $target: expr }) => { + { + fn get_type_uid<T: $crate::pair::ComponentOrWildcard>() + -> $crate::uid::Uid + { + T::uid() + } + + $crate::pair::Pair::builder() + .relation_id(get_type_uid::<$relation>()) + .target_as_data({ $target }) + .build() + } + }; + + (={ $relation: expr }, $target: ty) => { + { + fn get_type_uid<T: $crate::pair::ComponentOrWildcard>() + -> $crate::uid::Uid + { + T::uid() + } + + $crate::pair::Pair::builder() + .relation_as_data($relation) + .target_id(get_type_uid::<$target>()) + .build() + } + }; + + (@build, $relation: tt, $target: tt) => { + { + #[allow(dead_code)] + fn get_type_uid<T: $crate::pair::ComponentOrWildcard>() + -> $crate::uid::Uid + { + T::uid() + } + + $crate::pair::Pair::builder() + .relation_id($crate::pair!(@get_uid, $relation)) + .target_id($crate::pair!(@get_uid, $target)) + .build() + } + }; + + (@get_uid, $src: ty) => { + get_type_uid::<$src>() + }; + + (@get_uid, { $src: expr }) => { + $src + }; +} + mod sealed { pub trait Sealed {} |
