gluon-lang / gluon

A static, type inferred and embeddable language written in Rust.
https://gluon-lang.org
MIT License
3.16k stars 145 forks source link

How to check return type of script before trying to convert it? #939

Open Boscop opened 1 year ago

Boscop commented 1 year ago

In my use case, after evaluating a script, the final value can be one of several types that I want to support. E.g. I want to support 5 different custom types that the script can produce. The final value of the script should not be an enum though! So after evaluating a script, how can I check which gluon type the final value is, before I try to convert it to the equivalent Rust type? :) Or can I evaluate a script and then try converting the final value to a Rust type, to check if it succeeds?

Marwes commented 1 year ago

https://github.com/gluon-lang/gluon/blob/master/examples/marshalling.rs contains several examples though none exactly matches what you want.

You should be able to achieve it by using OpaqueValue<_, Hole> as the type on the rust side which will not put any type constraints on the gluon side. Then you can dereference that to a Value which you can extract via from_value or via pattern matching.

let (value, typ) = thread.run_expr::<OpaqueValue<RootedThread, Hole>()?;
// or match on `value`, whatever works for your typechecking into the 5 types you want to support
match typ {
}