Skip to content

apache/openwhisk-runtime-rust

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