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),
}
}
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