Apache OpenWhisk Runtime Rust supports Apache OpenWhisk functions written in Rust

Clone this repo:
  1. c21413d Update .asf.yaml - fix spelling (#51) by John Bampton · 2 weeks ago master
  2. 2bed1c4 update go proxy to 1.23@1.25.0 (#50) by David Grove · 5 weeks ago
  3. 9e80de6 update gradle plugin version to fix build (#49) by David Grove · 7 weeks ago
  4. 8df9be4 update gha versions (#48) by David Grove · 8 months ago
  5. 75567c4 update go proxy to 1.21@1.23.0 (#47) by David Grove · 1 year, 1 month ago

Apache OpenWhisk Runtime for Rust

License Continuous Integration

Give it a try today

To use as a Docker action:

wsk action update myAction my_action.rs --docker openwhisk/action-rust-v1.34

The file my_action.rs looks like:

extern crate serde_json;

use serde_derive::{Deserialize, Serialize};
use serde_json::{Error, Value};

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Input {
    #[serde(default = "stranger")]
    name: String,
}

#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Output {
    body: String,
}

fn stranger() -> String {
    "stranger".to_string()
}

pub fn main(args: Value) -> Result<Value, Error> {
    let input: Input = serde_json::from_value(args)?;
    let output = Output {
        body: format!("Hello, {}", input.name),
    };
    serde_json::to_value(output)
}

The action is mainly composed by a main function that accepts a JSON serdes Value as input and returns a Result including a JSON serde Value.

For the return result, not only support A JSON serde Value but also support Array serde Value

So a simple hello array funtion would be:

extern crate serde_json;

use serde_derive::{Deserialize, Serialize};
use serde_json::{Error, Value};


pub fn main(args: Value) -> Result<Value, Error> {
    let output = ["a", "b"];
    serde_json::to_value(output)
}

And support array result for sequence action as well, the first action‘s array result can be used as next action’s input parameter.

So the function can be:

extern crate serde_json;

use serde_derive::{Deserialize, Serialize};
use serde_json::{Error, Value};


pub fn main(args: Value) -> Result<Value, Error> {
    let inputParam = args.as_array();
    let defaultOutput = ["c", "d"];
    match inputParam {
        None => serde_json::to_value(defaultOutput),
        Some(x) => serde_json::to_value(x),
    }
}

Managing dependencies

If your action needs external dependencies, you need to provide a zip file including your source, and your cargo file with all your dependencies. The folder structure is the following:

|- Cargo.toml
|- src
    |- lib.rs

Here is an example of a Cargo.toml file

[package]
name = "actions"
version = "0.1.0"
authors = ["John Doe <john@doe.domain>"]
edition = "2018"

[dependencies]
serde_json = "1.0"
serde = "1.0"
serde_derive = "1.0"

Once you have all your code zipped in a file with the showed folder structure you can generate your action with the following command:

wsk action create yourAction /full_path_to/yourCode.zip --docker openwhisk/action-rust-v1.34