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
Conn
object will be passed onto every functions invoked in the process of handling client request and it will act as a primary interface for interacting with request/response dataIt 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;
}
}
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 */ } ```
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