Skip to content

Latest commit

 

History

History
114 lines (81 loc) · 2.44 KB

README.md

File metadata and controls

114 lines (81 loc) · 2.44 KB

rust-http-template

An unofficial OpenFaaS template for Rust - maintained by community members.

This repository contains two Rust templates for OpenFaaS, one of which gives additional control over the HTTP request and response. They will both handle higher throughput than the classic watchdog due to the process being kept warm.

$ faas template pull https://github.com/openfaas-incubator/rust-http-template

$ faas new --list
Languages available as templates:
- rust
- rust-http

Note: due to the Cargo registry being cached in the Dockerfile for these templates, BuildKit is required to build functions.

DOCKER_BUILDKIT=1 faas-cli build
DOCKER_BUILDKIT=1 faas-cli up

faas-cli publish already uses BuildKit, so no additional flags are required with this command.

rust-http-template/rust

This template takes body serialized to Vec of bytes as an input.

type Error = Box<dyn std::error::Error>;

const PHRASE: &str = "Hello, World!";

pub fn handle(_body: Vec<u8>) -> Result<Vec<u8>, Error> {
    Ok(PHRASE.as_bytes().to_vec())
}

// Returns:
// Hello, World!

You can return custom errors using Result.

use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct MyError {
    details: String
}

impl MyError {
    fn new(msg: &str) -> MyError {
        MyError{details: msg.to_string()}
    }
}

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f,"{}",self.details)
    }
}

impl Error for MyError {
    fn description(&self) -> &str {
        &self.details
    }
}

type BoxError = Box<dyn Error>;

pub fn handle(_body: Vec<u8>) -> Result<Vec<u8>, BoxError> {
    let error = MyError::new("my error");
    Err(Box::new(error))
}


// Returns:
// {"status": "500 Internal Server Error", "description":"my error"}

rust-http-template/rust-http

This template gives you more control over handling function input and output.

use hyper::{Body, Request, Response};

const PHRASE: &str = "Hello, World!";

pub fn handle(_req: Request<Body>) -> Response<Body> {
    Response::new(Body::from(PHRASE))
}

// Returns:
// Hello, World!

You can return custom errors using hyper::Response.

use hyper::{Body, Request, Response, StatusCode};

pub fn handle(_req: Request<Body>) -> Response<Body> {
    Response::builder()
        .status(StatusCode::INTERNAL_SERVER_ERROR)
        .body(Body::from("my error"))
        .unwrap()
}

// Returns:
// my error