rocket_lamb 0.6.0

A crate to allow running a Rocket webserver as an AWS Lambda Function with API Gateway
Documentation
#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]
extern crate rocket;

use lambda_http::{Body, Handler, Request};
use lambda_runtime::Context;
use rocket::http::uri::Origin;
use rocket_lamb::{BasePathBehaviour, RocketExt};
use std::error::Error;
use std::fs::File;

#[catch(404)]
fn not_found(req: &rocket::Request) -> String {
    req.uri().to_string()
}

#[get("/path")]
fn get_path<'r>(origin: &'r Origin<'r>) -> &'r str {
    origin.path()
}

fn make_rocket() -> rocket::Rocket {
    rocket::ignite()
        .mount("/", routes![get_path])
        .register(catchers![not_found])
}

fn get_request(json_file: &str) -> Result<Request, Box<dyn Error>> {
    let file = File::open(format!("tests/requests/{}.json", json_file))?;
    Ok(lambda_http::request::from_reader(file)?)
}

macro_rules! test_case {
    ($name:ident, $file:expr, $status:expr, $path:expr) => {
        test_case!($name, RemountAndInclude, $file, $status, $path);
    };
    ($name:ident, $path_behaviour:ident, $file:expr, $status:expr, $path:expr) => {
        #[test]
        fn $name() -> Result<(), Box<dyn Error>> {
            let mut handler = make_rocket()
                .lambda()
                .base_path_behaviour(BasePathBehaviour::$path_behaviour)
                .into_handler();

            let req = get_request($file)?;
            let res = handler.run(req, Context::default())?;

            assert_eq!(res.status(), $status);
            assert_eq!(*res.body(), Body::Text($path.to_string()));
            Ok(())
        }
    };
}

test_case!(api_gateway, "path_api_gateway", 200, "/Prod/path/");
test_case!(
    api_gateway_include_base,
    Include,
    "path_api_gateway",
    404,
    "/Prod/path/"
);
test_case!(
    api_gateway_exclude_base,
    Exclude,
    "path_api_gateway",
    200,
    "/path/"
);

test_case!(custom_domain, "path_custom_domain", 200, "/path/");
test_case!(
    custom_domain_include_empty_base,
    Include,
    "path_custom_domain",
    200,
    "/path/"
);
test_case!(
    custom_domain_exclude_empty_base,
    Exclude,
    "path_custom_domain",
    200,
    "/path/"
);

test_case!(
    custom_domain_with_base_path,
    "path_custom_domain_with_base",
    200,
    "/base-path/path/"
);
test_case!(
    custom_domain_with_base_path_include,
    Include,
    "path_custom_domain_with_base",
    404,
    "/base-path/path/"
);
test_case!(
    custom_domain_with_base_path_exclude,
    Exclude,
    "path_custom_domain_with_base",
    200,
    "/path/"
);

test_case!(application_load_balancer, "path_alb", 200, "/path/");
test_case!(
    application_load_balancer_include_empty_base,
    Include,
    "path_alb",
    200,
    "/path/"
);
test_case!(
    application_load_balancer_exclude_empty_base,
    Exclude,
    "path_alb",
    200,
    "/path/"
);