#web-framework #framework #web #proc-macro #actix-web #htmx #actix

macro ruxt_macros

The proc-macro crate for Ruxt, a file-based routing web framework

5 releases

0.1.4 May 5, 2024
0.1.3 May 4, 2024
0.1.2 May 4, 2024
0.1.1 May 3, 2024
0.1.0 May 3, 2024

#25 in #htmx

Download history 3/week @ 2024-07-31 3/week @ 2024-09-18 4/week @ 2024-09-25 4/week @ 2024-10-02

134 downloads per month
Used in ruxt

MIT license

16KB
243 lines

Ruxt Macros

This is a collection of macros for the Ruxt web framework.

Installation

Run the following command to add Ruxt to your project:

cargo add ruxt

Add the following to your Cargo.toml:

[dependencies]
ruxt-macros = "0.1.4"

Usage

#[ruxt_macros::main]
async fn main() -> std::io::Result<()> {
   let test_data = "Hello, World!";
   HttpServer::new(move || App::new().app_data(test_data.to_string()))
   .bind(("0.0.0.0", 8080))?
   .run()
   .await
}

Basic Routing

The Ruxt main macro will automatically generate routes for files in the routes directory. The routes are generated based on the file name, so a file named index.rs will be available at the root of the server.

The macro determines which HTTP verb to use based on the function name. For example, a function named get will be a GET route.

So for example:

// routes/index.rs
use actix_web::{web, HttpResponse, Responder};

pub async fn get() -> impl Responder {
    HttpResponse::Ok().body("Hello, World!")
}

Will be available as a GET request at http://localhost:8080/.

The following verbs are available for routing:

  • get
  • post
  • put
  • patch
  • delete

Dynamic Paths

Dynamic routes can be created by naming a folder or file with two leading underscores. For example, a folder named __user will create a dynamic route at /user/{id}.

// routes/__user.rs
use actix_web::{web, HttpResponse, Responder};

pub async fn post(id: web::Path<String>) -> impl Responder {
    HttpResponse::Ok().body(format!("Hello, {}!", id))
}

Will be available as a POST request at http://localhost:8080/user/{id}.

Current Limitations

  • As of now it is not possible to have a route with the name mod or index because of the way the macro generates routes. I'm looking into a solution for this.

License

This project is licensed under the MIT license.

Dependencies

~17–29MB
~487K SLoC