4个版本

0.1.3 2023年8月18日
0.1.2 2023年8月18日
0.1.1 2023年8月18日
0.1.0 2023年8月18日

#49 in #server-framework

40 每月下载量

MIT 许可证

150KB
2.5K SLoC

Rust 2K SLoC // 0.0% comments Python 560 SLoC // 0.4% comments

Tela

Version
Maintained Tests

Rust基础Web设计 😄

构建端点或错误处理程序如下。

use tela::prelude::*;
// This is a text/plain response
#[get("/")]
fn home() -> &'static str {
  "Hello, world!"
}
use tela::{prelude::*, response::HTML};
// This is a text/html response that could fail and the error should be either
// given to the appropriate handler or returned as is.
#[post("/login/:username/:age")]
fn data(username: String, age: i32) -> Result<HTML<String>> {
  response!(html!(<h1>"Hello, world!"</h1>))
}
use tela::{prelude::*, response::HTML};
// Catches any error that is 404 comming from another endpoint
// soon this will be for all 404 errors that are thrown
// All returns must be valid data. There can not be custom HTTP codes or results
// returned.
#[catch(404)]
fn not_found(code: u16, message: String, reason: String) -> HTML<String> {
  html!(<h1>{code}" "{message}</h1>)
}
use tela::{prelude::*, response::{JSON, Raw}};
// Endpoint that returns json with a custom HTTP code. This response is not
// caught by any other handlers.
// The `Raw` type can be used inside of a JSON type to represent a shapeless object.
#[get("/get-data")]
fn get_data() -> (u16, JSON<Raw>) {
  (203, JSON(json!({"name": "Tela"}))
}
use tela::{prelude::*, response::{JSON, Raw}, request::{Body, Query}};
use serde::{Serialize, Deserialize};

#[derive(Default, Serialize, Deserialize)]
struct User {
  name: String,
}

// The query and body can automatically be extracted from the request in the parameters.
// Just use `Body` and `Query`. If a extraction or a uri capture could be missing or you don't want
// Tela throwing a 500 error automatically, you can wrap the parameters type in an `Option`.
// Also note that the order of the parameters are not important.
#[get("/api/user/:username")]
fn get_user(query: Option<Query<User>>, username: String, Body(body): Body<i32>) -> Result<JSON<Raw>> {
  let username = match query {
    Some(User{name}) => name,
    None => String::new()
  };

  JSON(json!({"name": username, "age": body}))
}

运行应用程序如下。

use tela::{prelude::*, Server};

#[tela::main]
asyn fn main() {
  Server::new()
      .routes(group![home, data])
      .catch(not_found)
      .serve(3000)
      .await
}

待办事项

  • 使用 Tower 构建(超时、节流等)...
  • 支持HTTP/1和HTTP/2(目前仅支持HTTP/1)

灵感来源

工具


Made with rust Built with love

依赖关系

~7–18MB
~228K SLoC