From 17ec20cc34701d00bb855d7fafa0862755e427bb Mon Sep 17 00:00:00 2001 From: Quaternions Date: Mon, 26 Feb 2024 00:44:00 -0800 Subject: [PATCH] basic serialize --- src/main.rs | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index fec8bc6..fe0dceb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,6 +58,13 @@ impl mlua::UserData for Vector3{ //methods.add_method("area",|_,this,()| Ok(this.length * this.width)); methods.add_meta_function(mlua::MetaMethod::Add,|_,(this,val):(Self,Self)|Ok(Self(this.0+val.0))); + methods.add_meta_function(mlua::MetaMethod::ToString,|_,this:Self| + Ok(format!("Vector3.new({},{},{})", + this.0.x, + this.0.y, + this.0.z, + )) + ); } } @@ -93,6 +100,22 @@ impl mlua::UserData for CFrame{ //methods.add_meta_method(mlua::MetaMethod::Mul,|_,this,val:&Vector3|Ok(Vector3(this.0.matrix3*val.0+this.0.translation))); methods.add_meta_function(mlua::MetaMethod::Mul,|_,(this,val):(Self,Self)|Ok(Self(this.0*val.0))); + methods.add_meta_function(mlua::MetaMethod::ToString,|_,this:Self| + Ok(format!("CFrame.new({},{},{},{},{},{},{},{},{},{},{},{})", + this.0.translation.x, + this.0.translation.y, + this.0.translation.z, + this.0.matrix3.x_axis.x, + this.0.matrix3.y_axis.x, + this.0.matrix3.z_axis.x, + this.0.matrix3.x_axis.y, + this.0.matrix3.y_axis.y, + this.0.matrix3.z_axis.y, + this.0.matrix3.x_axis.z, + this.0.matrix3.y_axis.z, + this.0.matrix3.z_axis.z, + )) + ); } } impl<'lua> mlua::FromLua<'lua> for CFrame{ @@ -104,6 +127,49 @@ impl<'lua> mlua::FromLua<'lua> for CFrame{ } } +fn serialize(value:mlua::Value)->mlua::Result{ + Ok(match value{ + mlua::Value::Nil=>"nil".to_owned(), + mlua::Value::Boolean(boolean)=>format!("{boolean}"), + mlua::Value::Integer(value)=>format!("{value}"), + mlua::Value::Number(value)=>format!("{value}"), + mlua::Value::Vector(value)=>format!("{value}"), + mlua::Value::String(value)=>format!("\"{}\"",value.to_str()?), + mlua::Value::Table(table)=>{ + let mut s=String::new(); + s.push('{'); + let isnt_empty=!table.is_empty(); + for pair in table.pairs::(){ + let (i,v)=pair?; + s.push('['); + s.push_str(serialize(i)?.as_str()); + s.push_str("]="); + s.push_str(serialize(v)?.as_str()); + s.push(','); + } + if isnt_empty{ + //remove last comma + s.pop(); + } + s.push('}'); + s + }, + mlua::Value::UserData(userdata)=>{ + let met=userdata.get_metatable()?; + let f:mlua::Function=met.get("__tostring")?; + let s:mlua::String=f.call(userdata)?; + serialize(mlua::Value::String(s))? + }, + mlua::Value::Function(f)=>{ + println!("WARN: Serializing function {:?} as nil",f); + "nil".to_owned() + }, + mlua::Value::Thread(_)=>unimplemented!(), + mlua::Value::LightUserData(_)=>unimplemented!(), + mlua::Value::Error(_)=>unimplemented!(), + }) +} + fn bake(script_path:std::path::PathBuf)->Result<(),anyhow::Error>{ //read the file let script={ @@ -202,7 +268,7 @@ fn bake(script_path:std::path::PathBuf)->Result<(),anyhow::Error>{ let call_result:mlua::Result=lua.load(script).call(()); match call_result{ Ok(ret)=>{ - println!("gundata={:?}",ret); + println!("gundata={}",serialize(mlua::Value::Table(ret))?); }, Err(e)=>println!("Lua Error: {e}"), }