3 个版本
0.1.2 | 2021年2月18日 |
---|---|
0.1.1 | 2021年2月16日 |
0.1.0 | 2021年2月16日 |
#5 in #netlify
10KB
140 行代码(不含注释)
Netlify Rust 本地测试
本地测试您的 Netlify Rust 函数。无需 docker 容器。
完整工作示例 在此。我将它用作我的入门模板。
上下文
此库提供类型和转换器,允许您使用本地服务器在本地测试您的 Netlify 函数。技巧是将 lambda 请求和 hyper 请求类型转换为通用类型,单独处理,并返回转换为 lambda 响应类型或 hyper 响应类型的通用响应类型。
lambda 请求参数有点奇怪,我在 request
模块中复制了它们。即使它们对我来说并不完全有意义,我也想忠于生产环境中的实际情况。
通用处理程序
type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
use aws_lambda_events::encodings::Body;
use http::Response;
use llambda::request::Request;
pub async fn handle(_: Request) -> Result<Response<Body>, Error> {
let response = Response::builder()
.status(200)
.header("Content-Type", "text/plain; charset=utf-8")
.body(Body::from("🦀 Hello, Netlify 🦀"))
.expect("failed to render response");
Ok(response)
}
lambda 函数
use netlify_lambda_http::{
lambda::{lambda, Context},
IntoResponse, Request,
};
type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
pub mod handler;
#[lambda(http)]
#[tokio::main]
async fn main(request: Request, _: Context) -> Result<impl IntoResponse, Error> {
let req = llambda::request::Request::from_lambda(request).await?;
handler::handle(req).await
}
hyper 服务器
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use std::convert::Infallible;
type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
pub mod handler;
#[tokio::main]
pub async fn main() -> Result<(), Error> {
let make_svc = make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(handle)) });
let addr = ([127, 0, 0, 1], 7878).into();
let server = Server::bind(&addr).serve(make_svc);
server.await?;
Ok(())
}
async fn handle(request: Request<Body>) -> Result<Response<Body>, Error> {
let req = llambda::request::Request::from_hyper(request).await?;
let lambda_response = handler::handle(req).await?;
let resp = llambda::response::from_lambda(lambda_response);
Ok(resp)
}
如何构建
- 创建一个
server.rs
和一个handler.rs
,其中实现处理程序和服务器。 - 将二进制文件添加到
Cargo.toml
`
[[bin]]
name = "function"
path = "src/main.rs"
[[bin]]
name = "server"
path = "src/server.rs"
$cargo build
./target/debug/server
依赖项
~11–21MB
~315K SLoC