Ruby support #1
					 3 changed files with 33 additions and 8 deletions
				
			
		|  | @ -294,8 +294,8 @@ const ENTITY_VAR_NAME: &str = "entity"; | |||
| /// An error that can occur when internal [ScriptingPlugin] systems are being executed
 | ||||
| #[derive(Error, Debug)] | ||||
| pub enum ScriptingError { | ||||
|     #[error("script runtime error: {0}")] | ||||
|     RuntimeError(Box<dyn std::error::Error + Send>), | ||||
|     #[error("script runtime error: {0}\nscript backtrace:\n{1}")] | ||||
|     RuntimeError(String, String), | ||||
|     #[error("script compilation error: {0}")] | ||||
|     CompileError(Box<dyn std::error::Error + Send>), | ||||
|     #[error("no runtime resource present")] | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| // TODO: use funcall_public?
 | ||||
| use std::{ | ||||
|     collections::HashMap, | ||||
|     ffi::CString, | ||||
|  | @ -5,7 +6,7 @@ use std::{ | |||
|     thread::{self, JoinHandle}, | ||||
| }; | ||||
| 
 | ||||
| use ::magnus::value::Opaque; | ||||
| use ::magnus::{error::IntoError, typed_data::Inspect, value::Opaque}; | ||||
| use anyhow::anyhow; | ||||
| use bevy::{ | ||||
|     asset::Asset, | ||||
|  | @ -20,7 +21,7 @@ use magnus::{ | |||
|     value::{Lazy, ReprValue}, | ||||
| }; | ||||
| use magnus::{method, prelude::*}; | ||||
| use rb_sys::{VALUE, ruby_init_stack}; | ||||
| use rb_sys::{VALUE, rb_backtrace, rb_make_backtrace, ruby_init_stack}; | ||||
| use serde::Deserialize; | ||||
| 
 | ||||
| use crate::{ | ||||
|  | @ -223,7 +224,19 @@ impl TryConvert for BevyVec3 { | |||
| 
 | ||||
| impl From<magnus::Error> for ScriptingError { | ||||
|     fn from(value: magnus::Error) -> Self { | ||||
|         ScriptingError::RuntimeError(anyhow!(value.to_string()).into()) | ||||
|         // TODO: DRY
 | ||||
|         ScriptingError::RuntimeError( | ||||
|             value.inspect(), | ||||
|             value | ||||
|                 .value() | ||||
|                 .unwrap() | ||||
|                 .funcall::<_, _, magnus::RArray>("backtrace", ()) // TODO: is there an API for this
 | ||||
|                 // somehwere
 | ||||
|                 .unwrap() | ||||
|                 .to_vec::<String>() | ||||
|                 .unwrap() | ||||
|                 .join("\n"), | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -374,8 +387,20 @@ impl Runtime for RubyRuntime { | |||
|             var.ivar_set("_current", BevyEntity(entity)) | ||||
|                 .expect("Failed to set current entity handle"); | ||||
| 
 | ||||
|             ruby.eval::<magnus::value::Value>(&script) | ||||
|                 .map_err(|e| ScriptingError::RuntimeError(anyhow!(e.to_string()).into()))?; | ||||
|             unsafe { | ||||
|                 ruby.eval::<magnus::value::Value>(&script).map_err(|e| { | ||||
|                     ScriptingError::RuntimeError( | ||||
|                         e.inspect(), | ||||
|                         e.value() | ||||
|                             .unwrap() | ||||
|                             .funcall::<_, _, magnus::RArray>("backtrace", ()) | ||||
|                             .unwrap() | ||||
|                             .to_vec::<String>() | ||||
|                             .unwrap() | ||||
|                             .join("\n"), | ||||
|                     ) | ||||
|                 })?; | ||||
|             } | ||||
| 
 | ||||
|             var.ivar_set("_current", ruby.qnil().as_value()) | ||||
|                 .expect("Failed to unset current entity handle"); | ||||
|  |  | |||
|  | @ -52,7 +52,7 @@ pub(crate) fn process_new_scripts<R: Runtime>( | |||
|                     let path = asset_server | ||||
|                         .get_path(&script_component.script) | ||||
|                         .unwrap_or_default(); | ||||
|                     tracing::error!("error running script {} {:?}", path, e); | ||||
|                     tracing::error!("error running script {} {}", path, e); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue