About

Overview

Jeep train is an experimental high level web framework

The project is purely experimental and it is not meant to be used in a production environment.

The motivation behind the development is to - see if procedural macro can help define a runtime efficient router productively - explore ways to minimize boilerplate/learning cost

Feature

Routing

It looks like this.

rust router! { const NAME_OF_THE_ROUTER; scope "/api" { scope "/v1" { get api::v1::get; post api::v1::create; delete api::v1::destroy; } } scope "/resource" { resource index::resource; } }

Example

This code can be found on examples/resources.

```rust use jeeptrainprelude::*; use jeeptrainmacro::{ router, server, plugin }; use jeeptrainprelude::server::jeep_train;

fn settextheader(conn: Conn) { conn // obtain a mutex on response object for the user .mutresp() // insert a header data .setheaders("content-type".toowned(), "text".toowned()); }

fn default(conn: Conn) { conn.mutresp() .setresp(404, "not found"); }

fn luckyseven(conn: Conn) { if conn.path().len() == 7 { conn.mutresp() .set_resp(200, "lucky seven!") } }

fn rejectswearwords(conn: Conn) { if conn.path().contains("fuck") { conn.mutresp() .setresp(200, "don't swear") } }

plugin! { const DEFAULTRESPONSE; func luckyseven; func default; }

router! { const RESOURCEROUTER; scope "/resource" { plugin settextheader; resource resourcemodule; } }

server! { fn resourceserver; plugin rejectswearwords; router RESOURCEROUTER; plugin DEFAULT_RESPONSE; }

/// # Routes that it creates /// /// | method | path | function | /// | --- | --- | --- | /// | get | /resource/ | resourcemodule::index | /// | get | /resource/new | resourcemodule::new | /// | post | /resource/ | resourcemodule::create | /// | get | /resource/show | resourcemodule::show | /// | get | /resource/:id/edit | resourcemodule::edit | /// | put | /resource/:id | resourcemodule::update | /// | patch | /resource/:id | resourcemodule::update | /// | delete | /resource/ | resourcemodule::destroy | /// /// Note that /:id is a parameterized segment /// fn main() { jeeptrain("localhost:3000", resourceserver); }

pub mod resource_module { /* ...functions */ } ```

Benchmark

Jeep train doesn't use regular expression.
However, I think it's uncommon to register a regular expression on router on parameterized path to identify specific format of data. running 2 tests test router_actix ... bench: 836,812 ns/iter (+/- 22,033) test router_jeep_train ... bench: 1,491 ns/iter (+/- 51) Detail can be found in benchmark-result