From 95fab8503f7e139dd9bced86181e2571b92e6cce Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 21 Nov 2020 23:44:10 +0800 Subject: [PATCH] feat: add alibaba cloud fn template --- README.md | 9 ++++++- template.toml | 49 ++++++++++++++++++++++++++++++++++++ {{project_name}}/Cargo.toml | 19 ++++++++++++++ {{project_name}}/bootstrap | 2 ++ {{project_name}}/justfile | 10 ++++++++ {{project_name}}/src/main.rs | 39 ++++++++++++++++++++++++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 template.toml create mode 100644 {{project_name}}/Cargo.toml create mode 100755 {{project_name}}/bootstrap create mode 100644 {{project_name}}/justfile create mode 100644 {{project_name}}/src/main.rs diff --git a/README.md b/README.md index 883913b..1e8f0f2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ # alibabacloudfn-template -Alibaba Cloud Function Template \ No newline at end of file +Alibaba Cloud Function Template + + +Usage: +```shell +$ kickstart https://git.hatter.ink/templates/alibabacloudfn-template.git +``` + diff --git a/template.toml b/template.toml new file mode 100644 index 0000000..d0472bd --- /dev/null +++ b/template.toml @@ -0,0 +1,49 @@ +name = "Rust Alibaba Cloud Function template" +description = "Hatter's Rust Alibaba Cloud Function template" +kickstart_version = 1 +ignore = [ + ".gitignore", + "README.md", + "LICENSE", +] + +cleanup = [ +] + +[[variables]] +name = "project_name" +default = "My-Fn" +prompt = "What's the name of the project?" +validation = "^([a-zA-Z][a-zA-Z0-9_-]+)$" + +[[variables]] +name = "bin" +default = "my-fn" +prompt = "What's the name of the executable?" +validation = "^([a-zA-Z][a-zA-Z-_]+)$" + +[[variables]] +name = "author" +default = "No One" +prompt = "What is your name?" + +[[variables]] +name = "email" +default = "no@example.com" +prompt = "What is your email?" + +[[variables]] +name = "license" +default = "MIT" +prompt = "Which open-source license do you want to use?" +choices = [ + "MIT", + "BSD", + "GPLv3", + "None", +] + +[[variables]] +name = "description" +default = "A Alibaba Cloud Function application" +prompt = "A short description of the app?" diff --git a/{{project_name}}/Cargo.toml b/{{project_name}}/Cargo.toml new file mode 100644 index 0000000..1a4add1 --- /dev/null +++ b/{{project_name}}/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "{{project_name}}" +version = "0.0.1" +authors = ["{{author}} <{{email}}>"] +edition = "2018" +{% if license != "None" -%} +license = "{{license}}" +{%- endif %} +description = "{{description}}" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[[bin]] +name = "{{bin}}" +path = "src/main.rs" + +[dependencies] +tokio = { version = "0.2", features = ["full"] } +hyper = "0.13" diff --git a/{{project_name}}/bootstrap b/{{project_name}}/bootstrap new file mode 100755 index 0000000..c5af48e --- /dev/null +++ b/{{project_name}}/bootstrap @@ -0,0 +1,2 @@ +#!/bin/bash +./alibabacloundfn diff --git a/{{project_name}}/justfile b/{{project_name}}/justfile new file mode 100644 index 0000000..7607239 --- /dev/null +++ b/{{project_name}}/justfile @@ -0,0 +1,10 @@ +# build alibaba cloud fn +buildfn: + if [ -f "code.zip" ]; then rm code.zip; fi + dockerbuild :image:rust:1.47 :mirror:git://mirrors.ustc.edu.cn/crates.io-index \ + build --release --target-dir linux_target + cp linux_target/release/{{bin}} . + chmod +x bootstrap + zip code.zip bootstrap {{bin}} + rm {{bin}} + diff --git a/{{project_name}}/src/main.rs b/{{project_name}}/src/main.rs new file mode 100644 index 0000000..48552e6 --- /dev/null +++ b/{{project_name}}/src/main.rs @@ -0,0 +1,39 @@ +use std::convert::Infallible; +use hyper::service; +use hyper::{Body, Request, Response, Server}; + +async fn hello(request: Request) -> Result, Infallible> { + let mut buff = String::with_capacity(1024); + buff.push_str(&request.method().to_string()); + buff.push(' '); + buff.push_str(&request.uri().to_string()); + buff.push(' '); + buff.push_str(&format!("{:?}", request.version().to_owned())); + buff.push('\n'); + for header in request.headers() { + buff.push_str(&header.0.to_string()); + buff.push_str(": "); + let val = header.1.to_str().unwrap_or_else(|_| ""); + if header.0.to_string().contains("access-key-secret") && !val.is_empty() { + buff.push_str("******"); + } else { + buff.push_str(val); + } + buff.push('\n'); + } + Ok(Response::new(Body::from(buff))) +} + +#[tokio::main] +pub async fn main() -> Result<(), Box> { + let make_svc = service::make_service_fn(|_conn| { + async { Ok::<_, Infallible>(service::service_fn(hello)) } + }); + + let addr = ([0, 0, 0, 0], 9000).into(); + let server = Server::bind(&addr).serve(make_svc); + println!("Listening on http://{}", addr); + + server.await?; + Ok(()) +} \ No newline at end of file