Skip to content

Instantly share code, notes, and snippets.

@Marwes
Forked from huin/Cargo.toml
Last active December 11, 2019 09:44
Show Gist options
  • Save Marwes/f9924b50173546208770517c7e378827 to your computer and use it in GitHub Desktop.
Save Marwes/f9924b50173546208770517c7e378827 to your computer and use it in GitHub Desktop.
Userdata type unknown by name in Gluon
error: Type `MyUserdata` is not defined
- <example>:3:25
|
3 | type Foo = { x: MyUserdata }
| ^^^^^^^^^^
|
[package]
name = "gluon_userdata"
version = "0.1.0"
edition = "2018"
[dependencies]
gluon = "0.13.1"
gluon_codegen = "0.13.1"
gluon_vm = "0.13.1"
extern crate gluon;
#[macro_use]
extern crate gluon_codegen;
#[macro_use]
extern crate gluon_vm;
use gluon::import::add_extern_module;
use gluon::{vm, Thread, ThreadExt};
use gluon_vm::api::UserdataValue;
fn main() {
std::process::exit(match run() {
Ok(_) => 0,
Err(e) => {
eprintln!("{}", e);
1
}
});
}
fn run() -> Result<(), Box<dyn std::error::Error>> {
let vm = gluon::new_vm();
vm.register_type::<MyUserdata>("MyUserdata", &[])?;
add_extern_module(&vm, "make_userdata", load_userdata);
let v = vm.run_expr::<UserdataValue<MyUserdata>>(
"example",
r#"
let { MyUserdata, make_userdata } = import! make_userdata
type Foo = { x: MyUserdata }
let foo = { x = make_userdata 1 }
foo.x
"#,
)?;
println!("Got result: {:?}", v);
Ok(())
}
fn load_userdata(vm: &Thread) -> vm::Result<vm::ExternModule> {
vm::ExternModule::new(vm, record!( type MyUserdata => MyUserdata, make_userdata => primitive!(1, make_userdata)))
}
#[derive(Clone, Debug, Trace, Userdata, VmType)]
#[gluon(vm_type = "MyUserdata")]
struct MyUserdata(i32);
fn make_userdata(v: i32) -> MyUserdata {
MyUserdata(v)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment