Calling Elixir Scripts from within Rust

I’ve been thinking about how I could use Elixir as a scripting language within a Rust application. I read an interesting discussion about Rustler, NIFs and Ports, but this doesn’t quite seem to meet the use case I envision.

What I really want is a Rust application with the Erlang BEAM and Elixir embedded (probably when the Rust application is compiled?). Rust should be the main entry point and would initiate execution of the Elixir scripts, with any necessary results/changes being propagated back to the Rust app. (I guess think of something like a game engine written in C++ with an embedded Lua scripting engine).

I can think of a couple options where Rust an Elixir portions are their own processes and use Ports to communicate. Or where the Rust app launches some mix task and uses NIFs to access other Rust functionality. Both of these approaches seem clunky.

Has anyone got any thoughts or suggestions on how I might approach achieving such a goal?

I have one simple question - WHY?

I mean BEAM wasn’t designed as a embedded scripting engine, so it isn’t easy accessible as one. You can though look at the Enigma which is BEAM implementation in Rust, so maybe you could integrate that.

TBH If you want embedded language in Rust then look into Lua(JIT), Ketos, or Dyon.

5 Likes

You could potentially compile your elixir code as escripts, then just launch them from the Rust app sending necessary data as command line arguments or from stdin and reading the result from stdout.

This has some downsides and may not work or be performant enough depending on what you are trying to accomplish but it could work for you. Usually I do the opposite and launch fast Rust apps all the time from my main Elixir long-running app.

3 Likes