Ruby support #1
					 6 changed files with 84 additions and 10 deletions
				
			
		|  | @ -77,8 +77,16 @@ where | ||||||
|             let result = inner_system.run((), world); |             let result = inner_system.run((), world); | ||||||
|             inner_system.apply_deferred(world); |             inner_system.apply_deferred(world); | ||||||
|             let mut runtime = world.get_resource_mut::<R>().expect("No runtime resource"); |             let mut runtime = world.get_resource_mut::<R>().expect("No runtime resource"); | ||||||
|             runtime | 
 | ||||||
|                 .with_engine_mut(move |engine| Out::into_runtime_value_with_engine(result, engine)) |             if R::is_current_thread() { | ||||||
|  |                 runtime.with_engine_mut(move |engine| { | ||||||
|  |                     Out::into_runtime_value_with_engine(result, engine) | ||||||
|  |                 }) | ||||||
|  |             } else { | ||||||
|  |                 runtime.with_engine_thread_mut(move |engine| { | ||||||
|  |                     Out::into_runtime_value_with_engine(result, engine) | ||||||
|  |                 }) | ||||||
|  |             } | ||||||
|         }; |         }; | ||||||
|         let system = IntoSystem::into_system(system_fn); |         let system = IntoSystem::into_system(system_fn); | ||||||
|         CallbackSystem { |         CallbackSystem { | ||||||
|  | @ -110,9 +118,15 @@ macro_rules! impl_tuple { | ||||||
|                     let result = inner_system.run(args, world); |                     let result = inner_system.run(args, world); | ||||||
|                     inner_system.apply_deferred(world); |                     inner_system.apply_deferred(world); | ||||||
|                     let mut runtime = world.get_resource_mut::<RN>().expect("No runtime resource"); |                     let mut runtime = world.get_resource_mut::<RN>().expect("No runtime resource"); | ||||||
|                     runtime.with_engine_mut(move |engine| { |                     if RN::is_current_thread() { | ||||||
|                         Out::into_runtime_value_with_engine(result, engine) |                         runtime.with_engine_mut(move |engine| { | ||||||
|                     }) |                             Out::into_runtime_value_with_engine(result, engine) | ||||||
|  |                         }) | ||||||
|  |                     } else { | ||||||
|  |                         runtime.with_engine_thread_mut(move |engine| { | ||||||
|  |                             Out::into_runtime_value_with_engine(result, engine) | ||||||
|  |                         }) | ||||||
|  |                     } | ||||||
|                 }; |                 }; | ||||||
|                 let system = IntoSystem::into_system(system_fn); |                 let system = IntoSystem::into_system(system_fn); | ||||||
|                 CallbackSystem { |                 CallbackSystem { | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								src/lib.rs
									
									
									
									
									
								
							|  | @ -300,10 +300,12 @@ pub trait Runtime: Resource + Default { | ||||||
|     type Value: Send + Clone; |     type Value: Send + Clone; | ||||||
|     type RawEngine; |     type RawEngine; | ||||||
| 
 | 
 | ||||||
|  |     fn is_current_thread() -> bool; | ||||||
|  | 
 | ||||||
|     /// Provides mutable reference to raw scripting engine instance.
 |     /// Provides mutable reference to raw scripting engine instance.
 | ||||||
|     /// Can be used to directly interact with an interpreter to use interfaces
 |     /// Can be used to directly interact with an interpreter to use interfaces
 | ||||||
|     /// that bevy_scriptum does not provided adapters for.
 |     /// that bevy_scriptum does not provided adapters for.
 | ||||||
|     fn with_engine_mut<T: Send + 'static>( |     fn with_engine_thread_mut<T: Send + 'static>( | ||||||
|         &mut self, |         &mut self, | ||||||
|         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, |         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, | ||||||
|     ) -> T; |     ) -> T; | ||||||
|  | @ -311,11 +313,21 @@ pub trait Runtime: Resource + Default { | ||||||
|     /// Provides immutable reference to raw scripting engine instance.
 |     /// Provides immutable reference to raw scripting engine instance.
 | ||||||
|     /// Can be used to directly interact with an interpreter to use interfaces
 |     /// Can be used to directly interact with an interpreter to use interfaces
 | ||||||
|     /// that bevy_scriptum does not provided adapters for.
 |     /// that bevy_scriptum does not provided adapters for.
 | ||||||
|     fn with_engine<T: Send + 'static>( |     fn with_engine_thread<T: Send + 'static>( | ||||||
|         &self, |         &self, | ||||||
|         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, |         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, | ||||||
|     ) -> T; |     ) -> T; | ||||||
| 
 | 
 | ||||||
|  |     /// Provides mutable reference to raw scripting engine instance.
 | ||||||
|  |     /// Can be used to directly interact with an interpreter to use interfaces
 | ||||||
|  |     /// that bevy_scriptum does not provided adapters for.
 | ||||||
|  |     fn with_engine_mut<T>(&mut self, f: impl FnOnce(&mut Self::RawEngine) -> T) -> T; | ||||||
|  | 
 | ||||||
|  |     /// Provides immutable reference to raw scripting engine instance.
 | ||||||
|  |     /// Can be used to directly interact with an interpreter to use interfaces
 | ||||||
|  |     /// that bevy_scriptum does not provided adapters for.
 | ||||||
|  |     fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T; | ||||||
|  | 
 | ||||||
|     fn eval( |     fn eval( | ||||||
|         &self, |         &self, | ||||||
|         script: &Self::ScriptAsset, |         script: &Self::ScriptAsset, | ||||||
|  |  | ||||||
|  | @ -257,6 +257,24 @@ impl Runtime for LuaRuntime { | ||||||
|         let engine = self.engine.lock().unwrap(); |         let engine = self.engine.lock().unwrap(); | ||||||
|         f(&engine) |         f(&engine) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn with_engine_thread_mut<T: Send + 'static>( | ||||||
|  |         &mut self, | ||||||
|  |         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, | ||||||
|  |     ) -> T { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn with_engine_thread<T: Send + 'static>( | ||||||
|  |         &self, | ||||||
|  |         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, | ||||||
|  |     ) -> T { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn is_current_thread() -> bool { | ||||||
|  |         true | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, T: IntoLuaMulti<'a>> IntoRuntimeValueWithEngine<'a, T, LuaRuntime> for T { | impl<'a, T: IntoLuaMulti<'a>> IntoRuntimeValueWithEngine<'a, T, LuaRuntime> for T { | ||||||
|  |  | ||||||
|  | @ -160,6 +160,24 @@ impl Runtime for RhaiRuntime { | ||||||
|     fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T { |     fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T { | ||||||
|         f(&self.engine) |         f(&self.engine) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn with_engine_thread_mut<T: Send + 'static>( | ||||||
|  |         &mut self, | ||||||
|  |         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, | ||||||
|  |     ) -> T { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn with_engine_thread<T: Send + 'static>( | ||||||
|  |         &self, | ||||||
|  |         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, | ||||||
|  |     ) -> T { | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn is_current_thread() -> bool { | ||||||
|  |         true | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Default for RhaiRuntime { | impl Default for RhaiRuntime { | ||||||
|  |  | ||||||
|  | @ -136,7 +136,7 @@ impl Runtime for RubyRuntime { | ||||||
| 
 | 
 | ||||||
|     type RawEngine = magnus::Ruby; |     type RawEngine = magnus::Ruby; | ||||||
| 
 | 
 | ||||||
|     fn with_engine_mut<T: Send + 'static>( |     fn with_engine_thread_mut<T: Send + 'static>( | ||||||
|         &mut self, |         &mut self, | ||||||
|         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, |         f: impl FnOnce(&mut Self::RawEngine) -> T + Send + 'static, | ||||||
|     ) -> T { |     ) -> T { | ||||||
|  | @ -146,7 +146,7 @@ impl Runtime for RubyRuntime { | ||||||
|             .execute_in(Box::new(move |mut ruby| f(&mut ruby))) |             .execute_in(Box::new(move |mut ruby| f(&mut ruby))) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn with_engine<T: Send + 'static>( |     fn with_engine_thread<T: Send + 'static>( | ||||||
|         &self, |         &self, | ||||||
|         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, |         f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static, | ||||||
|     ) -> T { |     ) -> T { | ||||||
|  | @ -156,6 +156,14 @@ impl Runtime for RubyRuntime { | ||||||
|             .execute_in(Box::new(move |ruby| f(&ruby))) |             .execute_in(Box::new(move |ruby| f(&ruby))) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     fn with_engine_mut<T>(&mut self, f: impl FnOnce(&mut Self::RawEngine) -> T) -> T { | ||||||
|  |         unimplemented!(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T { | ||||||
|  |         unimplemented!(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fn eval( |     fn eval( | ||||||
|         &self, |         &self, | ||||||
|         script: &Self::ScriptAsset, |         script: &Self::ScriptAsset, | ||||||
|  | @ -256,6 +264,10 @@ impl Runtime for RubyRuntime { | ||||||
|     ) -> Result<Self::Value, crate::ScriptingError> { |     ) -> Result<Self::Value, crate::ScriptingError> { | ||||||
|         todo!() |         todo!() | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn is_current_thread() -> bool { | ||||||
|  |         false | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub mod prelude { | pub mod prelude { | ||||||
|  |  | ||||||
|  | @ -495,7 +495,7 @@ mod ruby_tests { | ||||||
|         fn assert_state_key_value_i64(world: &World, _entity_id: Entity, key: &str, value: i64) { |         fn assert_state_key_value_i64(world: &World, _entity_id: Entity, key: &str, value: i64) { | ||||||
|             let runtime = world.get_resource::<RubyRuntime>().unwrap(); |             let runtime = world.get_resource::<RubyRuntime>().unwrap(); | ||||||
|             let key = key.to_string(); |             let key = key.to_string(); | ||||||
|             runtime.with_engine(move |engine| { |             runtime.with_engine_thread(move |engine| { | ||||||
|                 let state: magnus::value::Value = engine.class_object().const_get("STATE").unwrap(); |                 let state: magnus::value::Value = engine.class_object().const_get("STATE").unwrap(); | ||||||
|                 let res: i64 = state.funcall_public("[]", (key,)).unwrap(); |                 let res: i64 = state.funcall_public("[]", (key,)).unwrap(); | ||||||
|                 assert_eq!(res, value) |                 assert_eq!(res, value) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue