# openwhisk-runtime-rust **Repository Path**: mirrors_apache/openwhisk-runtime-rust ## Basic Information - **Project Name**: openwhisk-runtime-rust - **Description**: Apache OpenWhisk Runtime Rust supports Apache OpenWhisk functions written in Rust - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-22 - **Last Updated**: 2026-04-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Apache OpenWhisk Runtime for Rust [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) [![Continuous Integration](https://github.com/apache/openwhisk-runtime-rust/actions/workflows/ci.yaml/badge.svg)](https://github.com/apache/openwhisk-runtime-rust/actions/workflows/ci.yaml) ### 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 { 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: ```rust extern crate serde_json; use serde_derive::{Deserialize, Serialize}; use serde_json::{Error, Value}; pub fn main(args: Value) -> Result { 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: ```rust extern crate serde_json; use serde_derive::{Deserialize, Serialize}; use serde_json::{Error, Value}; pub fn main(args: Value) -> Result { 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 "] 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 ```