Rust-lang interaction

Hi…
Is there any way to interact between Julia and Rust, a way that allow:

  1. Calling Rust function from Julia, like ccall
  2. Calling Julia from Rust

Thanks

2 Likes

There was some abandoned work in this direction:

And previous discussion:

1 Like

That package of Eric’s looks pretty cool, I’ve been wanting to see about Rust for some time now.
Maybe that package should be resurrected.

1 Like

I found the below way to solve it, and liked to share with the community:

Executing Julia from Rust

Use the Rust Command as below:

Create simple main.jl file, that contains:

# __precompile__()   # If required to be kept precompiled for faster execution
# name = isempty(ARGS) ? "name" : ARGS[1] # To check input arguments
println("hello from Julia function")

Create simple main.rs file, that contains:

use std::process::Command;

fn main() {
    println!("Hello from Rust");
    let mut cmd = Command::new("Julia");
    cmd.arg("main.jl");
    // cmd.args(&["main.jl", "arg1", "arg2"]);
    match cmd.output(){
                Ok(o) => {
                    unsafe{
                        println!("Output: {}", String::from_utf8_unchecked(o.stdout));
                    }
                },
                Err(e) => {
                    println!("There was an error {}", e);
                }
            }
}

Then, by running cargo run you’ll get the required output s below:

enter image description here

Executing Rust from Julia

Use the calling-c-and-fortran-code by ccall

Create rust shared library, simple lib.rs file, that contains:

#[no_mangle]
pub extern fn double_input(input: i32) -> i32 {
    println!("Hello from Rust");
    input * 2
}

The Cargo.toml for building the library, is:

[package]
name = "julia_call_rust"
version = "0.1.0"
authors = ["hasan yousef]

[lib]
name = "my_rust_lib"
crate-type = ["dylib"]

Create simple main.jl file, that contains:

println("Hello from Julia")
input = 10 #Int32(10)
output =  ccall(   #(:function or "function", "library"), Return type, (Input types,), arguments if any)
                (:double_input,
                "target/debug/libmy_rust_lib"),
                Int32,          # Return type
                (Int32,),       # (Input types,)
                input)          # Arguments if any
println("As result of $input * 2 is: $output")

Then, by running cargo build to get the rust library built, and by running julia main.jl you’ll get the required output s below:

enter image description here

19 Likes

(once more, two ways please)
This is the first I have seen where Julia and Rust get together with a light touch. Thank you for sharing it with the Julia Community via Discourse; this let’s other bringers of good programming see and utilize it. It would be of additional help to have each way (use Rust from within Julia, use Julia through Rust) separately described using an example with numeric values or a struct in addition to the nice writeup you already posted. Cudos.

8 Likes

Please, check out: [ANN] Rust Library embedded in a Julia Package

1 Like