summaryrefslogtreecommitdiff
path: root/examples/serialize.rs
blob: 7c9ae69e9095be22d70256d352b671519990c7fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use mlua::{Error, Lua, LuaSerdeExt, Result, UserData, Value};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
enum Transmission {
    Manual,
    Automatic,
}

#[derive(Serialize, Deserialize)]
struct Engine {
    v: u32,
    kw: u32,
}

#[derive(Serialize, Deserialize)]
struct Car {
    active: bool,
    model: String,
    transmission: Transmission,
    engine: Engine,
}

impl UserData for Car {}

fn main() -> Result<()> {
    let lua = Lua::new();
    let globals = lua.globals();

    // Create Car struct from a Lua table
    let car: Car = lua.from_value(lua.load(r#"
        {active = true, model = "Volkswagen Golf", transmission = "Automatic", engine = {v = 1499, kw = 90}}
    "#).eval()?)?;

    // Set it as (serializable) userdata
    globals.set("null", lua.null())?;
    globals.set("array_mt", lua.array_metatable())?;
    globals.set("car", lua.create_ser_userdata(car)?)?;

    // Create a Lua table with multiple data types
    let val: Value = lua
        .load(r#"{driver = "Boris", car = car, price = null, points = setmetatable({}, array_mt)}"#)
        .eval()?;

    // Serialize the table above to JSON
    let json_str = serde_json::to_string(&val).map_err(Error::external)?;
    println!("{}", json_str);

    // Create Lua Value from JSON (or any serializable type)
    let json = serde_json::json!({
        "key": "value",
        "null": null,
        "array": [],
    });
    globals.set("json_value", lua.to_value(&json)?)?;
    lua.load(
        r#"
        assert(json_value["key"] == "value")
        assert(json_value["null"] == null)
        assert(#(json_value["array"]) == 0)
    "#,
    )
    .exec()?;

    Ok(())
}