lib.rs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use specs::join::Join;
  2. struct Pos {
  3. x: usize,
  4. }
  5. impl specs::Component for Pos {
  6. type Storage = specs::VecStorage<Pos>;
  7. }
  8. struct Mov;
  9. impl specs::Component for Mov {
  10. type Storage = specs::VecStorage<Mov>;
  11. }
  12. macro_rules! system {
  13. ($name:ident $pat:tt => $block:block ) => {
  14. struct $name;
  15. impl<'a> specs::System<'a> for $name {
  16. type SystemData = args_to_systemdata!($pat);
  17. fn run(&mut self, args_to_pat!($pat): Self::SystemData) {
  18. for args_to_pat!($pat) in (args_to_join!($pat)).join() {
  19. $block
  20. }
  21. }
  22. }
  23. };
  24. }
  25. macro_rules! args_to_systemdata {
  26. ( ( $( $name:ident : $ty: ty ),* ) ) => {
  27. ( $( specs::WriteStorage<'a, $ty> ),* )
  28. }
  29. }
  30. macro_rules! args_to_pat {
  31. ( ( $( $name:ident : $ty: ty ),* ) ) => {
  32. ( $( mut $name ),* )
  33. }
  34. }
  35. macro_rules! args_to_join {
  36. ( ( $( $name:ident : $ty: ty ),* ) ) => {
  37. ( $( &mut $name ),* )
  38. }
  39. }
  40. system!{ Foo (_x: Mov, y: Pos) => {
  41. y.x += 1;
  42. }
  43. }
  44. #[cfg(test)]
  45. mod tests {
  46. #[test]
  47. fn it_works() {
  48. assert_eq!(2 + 2, 4);
  49. }
  50. }