I want to allow the users of my project be able to write the driving logic, while I provide the tools. What are some embedded scripting languages in Rust that can be sandboxed and are easy for absolute beginners?
edit: Thanks for all of your answers, I decided to go with lua using mlua
Another meme answer: nu
.
I never actually used nu
for anything. But I’ve been thinking (unironically) that nu
with its built-in from_json
and to_json
can be interesting.
The use-case I had in mind is not games or anything like that, but some system or dev tools that traditionally utilized shell scripts, but are moving towards better languages like python. So I thought a single binary that embeds nu
, but also has a lot of sub-commands that implement a lot of sub-tasks in Rust directly, and with JSON used as an exchange format, the combination can be interesting.
Now that I think about it more, this can work in both directions, with main execution being in nu (what I had in mind), or in Rust.
nu
even has an lsp server, so the development experience should theoretically be good.
Would something like Steel work?
The Helix editor is working on adding it as a plugin scripting language. You could take a look at the in-progress fork to see how they’re doing it.
Many languages can be compiled to wasm, and it’s quite easy to load and run wasm from rust
That way you could give the user multiple options, they could write it in rust, c, c++, javascript, etc
Although the OP has already decided to go with Lua, if anyone else looking at this thread is considering their options for making a plugin system, WASM/WASI is an excellent choice - mostly because it allows users to use Python (a favorite among programming newbies) along with any other language that compiles to WebAssembly (which will eventually be all languages).
You can even use something like Extism which is purpose-built as a drop-in library for creating a plugin system with WASM plugins, or you can use other runtime options like Wasmtime (built in Rust, from the ByteCode Alliance - where the WASI spec is being developed) or the WasmEdge runtime (built in C++, which is a CNCF project and is already being used in areas like eBPF to help users build Linux Kernel extensions).
In short, if you’re building a project that has to be maintained long-term and you need a plugin system, then choose WebAssembly - you can’t go wrong.
Cheers!
WASM is a bit overkill and is also complicated. I need a simple scripting language that won’t stress the users out. As mentioned in my post, I expect them to be absolute beginners.
I didn’t mean that the users would write wasm, just that they could write it in some language, then your program would compile it to wasm and run it
Gives some flexibility as to the choice of language and it runs sandboxed
There is a Python interpreter written in Rust. It’s apparently intended to (besides being fast an all that) make Rust scriptable.
I’m aware that pyo3 is a thing, but last I checked that was just Rust bindings to CPython. Is this not that?