Trait me3_framework::scripting::lua::serde::LuaSerdeExt
source · [−]pub trait LuaSerdeExt<'lua> {
fn null(&'lua self) -> Value<'lua>;
fn array_metatable(&'lua self) -> Table<'lua>;
fn to_value<T>(&'lua self, t: &T) -> Result<Value<'lua>, Error>
where
T: Serialize + ?Sized;
fn to_value_with<T>(
&'lua self,
t: &T,
options: Options
) -> Result<Value<'lua>, Error>
where
T: Serialize + ?Sized;
fn from_value<T>(&'lua self, value: Value<'lua>) -> Result<T, Error>
where
T: Deserialize<'lua>;
fn from_value_with<T>(
&'lua self,
value: Value<'lua>,
options: Options
) -> Result<T, Error>
where
T: Deserialize<'lua>;
}
Expand description
Trait for serializing/deserializing Lua values using Serde.
Required Methods
sourcefn null(&'lua self) -> Value<'lua>
fn null(&'lua self) -> Value<'lua>
A special value (lightuserdata) to encode/decode optional (none) values.
Requires feature = "serialize"
Example
use std::collections::HashMap;
use mlua::{Lua, Result, LuaSerdeExt};
fn main() -> Result<()> {
let lua = Lua::new();
lua.globals().set("null", lua.null())?;
let val = lua.load(r#"{a = null}"#).eval()?;
let map: HashMap<String, Option<String>> = lua.from_value(val)?;
assert_eq!(map["a"], None);
Ok(())
}
sourcefn array_metatable(&'lua self) -> Table<'lua>
fn array_metatable(&'lua self) -> Table<'lua>
A metatable attachable to a Lua table to systematically encode it as Array (instead of Map).
As result, encoded Array will contain only sequence part of the table, with the same length
as the #
operator on that table.
Requires feature = "serialize"
Example
use mlua::{Lua, Result, LuaSerdeExt};
use serde_json::Value as JsonValue;
fn main() -> Result<()> {
let lua = Lua::new();
lua.globals().set("array_mt", lua.array_metatable())?;
// Encode as an empty array (no sequence part in the lua table)
let val = lua.load("setmetatable({a = 5}, array_mt)").eval()?;
let j: JsonValue = lua.from_value(val)?;
assert_eq!(j.to_string(), "[]");
// Encode as object
let val = lua.load("{a = 5}").eval()?;
let j: JsonValue = lua.from_value(val)?;
assert_eq!(j.to_string(), r#"{"a":5}"#);
Ok(())
}
sourcefn to_value<T>(&'lua self, t: &T) -> Result<Value<'lua>, Error>where
T: Serialize + ?Sized,
fn to_value<T>(&'lua self, t: &T) -> Result<Value<'lua>, Error>where
T: Serialize + ?Sized,
Converts T
into a Value
instance.
Requires feature = "serialize"
Example
use mlua::{Lua, Result, LuaSerdeExt};
use serde::Serialize;
#[derive(Serialize)]
struct User {
name: String,
age: u8,
}
fn main() -> Result<()> {
let lua = Lua::new();
let u = User {
name: "John Smith".into(),
age: 20,
};
lua.globals().set("user", lua.to_value(&u)?)?;
lua.load(r#"
assert(user["name"] == "John Smith")
assert(user["age"] == 20)
"#).exec()
}
sourcefn to_value_with<T>(
&'lua self,
t: &T,
options: Options
) -> Result<Value<'lua>, Error>where
T: Serialize + ?Sized,
fn to_value_with<T>(
&'lua self,
t: &T,
options: Options
) -> Result<Value<'lua>, Error>where
T: Serialize + ?Sized,
Converts T
into a Value
instance with options.
Requires feature = "serialize"
Example
use mlua::{Lua, Result, LuaSerdeExt, SerializeOptions};
fn main() -> Result<()> {
let lua = Lua::new();
let v = vec![1, 2, 3];
let options = SerializeOptions::new().set_array_metatable(false);
lua.globals().set("v", lua.to_value_with(&v, options)?)?;
lua.load(r#"
assert(#v == 3 and v[1] == 1 and v[2] == 2 and v[3] == 3)
assert(getmetatable(v) == nil)
"#).exec()
}
sourcefn from_value<T>(&'lua self, value: Value<'lua>) -> Result<T, Error>where
T: Deserialize<'lua>,
fn from_value<T>(&'lua self, value: Value<'lua>) -> Result<T, Error>where
T: Deserialize<'lua>,
Deserializes a Value
into any serde deserializable object.
Requires feature = "serialize"
Example
use mlua::{Lua, Result, LuaSerdeExt};
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct User {
name: String,
age: u8,
}
fn main() -> Result<()> {
let lua = Lua::new();
let val = lua.load(r#"{name = "John Smith", age = 20}"#).eval()?;
let u: User = lua.from_value(val)?;
assert_eq!(u, User { name: "John Smith".into(), age: 20 });
Ok(())
}
sourcefn from_value_with<T>(
&'lua self,
value: Value<'lua>,
options: Options
) -> Result<T, Error>where
T: Deserialize<'lua>,
fn from_value_with<T>(
&'lua self,
value: Value<'lua>,
options: Options
) -> Result<T, Error>where
T: Deserialize<'lua>,
Deserializes a Value
into any serde deserializable object with options.
Requires feature = "serialize"
Example
use mlua::{Lua, Result, LuaSerdeExt, DeserializeOptions};
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct User {
name: String,
age: u8,
}
fn main() -> Result<()> {
let lua = Lua::new();
let val = lua.load(r#"{name = "John Smith", age = 20, f = function() end}"#).eval()?;
let options = DeserializeOptions::new().deny_unsupported_types(false);
let u: User = lua.from_value_with(val, options)?;
assert_eq!(u, User { name: "John Smith".into(), age: 20 });
Ok(())
}