Skip to content

Instantly share code, notes, and snippets.

@huin
Last active December 11, 2019 09:43
Show Gist options
  • Save huin/e89ec0b11d6c5906ade3fde735ba2ade to your computer and use it in GitHub Desktop.
Save huin/e89ec0b11d6c5906ade3fde735ba2ade 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 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, 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