Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tired-fox/tela
A Rust library for building web applications using hyper and some custom macros.
https://github.com/tired-fox/tela
Last synced: 25 days ago
JSON representation
A Rust library for building web applications using hyper and some custom macros.
- Host: GitHub
- URL: https://github.com/tired-fox/tela
- Owner: Tired-Fox
- License: mit
- Created: 2023-07-06T22:48:05.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-02-06T00:29:34.000Z (9 months ago)
- Last Synced: 2024-10-11T18:09:45.836Z (27 days ago)
- Language: Rust
- Homepage:
- Size: 610 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Tela
Rust based web design :smile:
Construct endpoints or error handlers like so.
```rust
use tela::prelude::*;
// This is a text/plain response
#[get("/")]
fn home() -> &'static str {
"Hello, world!"
}
``````rust
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> {
response!(html!("Hello, world!"
))
}
``````rust
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 {
html!({code}" "{message}
)
}
``````rust
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) {
(203, JSON(json!({"name": "Tela"}))
}
``````rust
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>, username: String, Body(body): Body) -> Result> {
let username = match query {
Some(User{name}) => name,
None => String::new()
};JSON(json!({"name": username, "age": body}))
}
```Run an app like so.
```rust
use tela::{prelude::*, Server};#[tela::main]
asyn fn main() {
Server::new()
.routes(group![home, data])
.catch(not_found)
.serve(3000)
.await
}
```## TODO:
- [ ] Built it timeout, throtteling, etc... with `Tower`
- [ ] HTTP/1 and HTTP/2 Support (Currently only HTTP/1)**Inspiration**
- [Axum](https://github.com/tokio-rs/axum)
- [Actix](https://github.com/actix/actix-web)
- [Warp](https://github.com/seanmonstar/warp)
- [Rocket](https://rocket.rs/)**Tools**
- [Tokio](https://tokio.rs/)
- [Hyper](https://hyper.rs/) - Focus on `1.0 release`
- [Tower](https://github.com/tower-rs/tower)- [proc-macro-errors](https://docs.rs/proc-macro-error/latest/proc_macro_error/)
- [proc-macro2](https://docs.rs/proc-macro2/latest/proc_macro2/)
- [quote](https://docs.rs/quote/latest/quote/)
- [syn](https://docs.rs/syn/latest/syn/)- [typed-html](https://crates.io/crates/typed-html/0.2.2) for html macro inspiration and [html-to-string-macro](https://docs.rs/html-to-string-macro/latest/src/html_to_string_macro/lib.rs.html#96-105) for html responses.