1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//! `front-line` - A declarative, zero-copy HTTP router for Rust.
//!
//! The `front-line` crate provides utilities to route HTTP requests based on their method and path,
//! offering both manual routing capabilities and a declarative macro-driven approach for simpler use cases.
//! It emphasizes zero-copy operations to maximize efficiency and performance.
//!
//! ## Features:
//!
//! - **Declarative:** Define routes as enums with proc-macro attributes.
//! - **Zero-copy capture:** Easily capture dynamic segments from paths (e.g., `/users/{id}`)
//! with opt-in zero-copy capture to avoid unnecessary copying and allocations.
//! - **Dispatch free:** Only handles path based route resolution and allows the user to choose
//! how to perform dispatch.
//!
//! ## Basic Usage:
//!
//! ```rust
//! use front_line::{FrontLine, HttpVersion, RouterResult, Router};
//!
//! #[derive(FrontLine)]
//! enum MarketingRoutes {
//! #[get("/")]
//! RenderIndex,
//! #[get("/sign-up")]
//! RenderSignUp,
//! #[post("/sign-up")]
//! ProcessSignUp,
//! #[get("/log-in")]
//! RenderLogIn,
//! #[post("/log-in")]
//! ProcessLogIn,
//! #[get("/portal")]
//! RenderPortal,
//! }
//!
//! #[derive(FrontLine)]
//! #[prefix("/api")]
//! enum ApiRoutes<'a> {
//! #[get("/users")]
//! GetAllUsers,
//! #[post("/users")]
//! CreateUser,
//! #[get("/users/{id}")]
//! GetUser { id: u32 },
//! #[get("/users/{id}/roles/{role}")]
//! GetUserRole { id: u32, role: &'a str },
//! #[put("/users/{id}/roles/{role}")]
//! UpdateUserRole { id: u32, role: &'a str },
//! }
//!
//! #[derive(FrontLine)]
//! enum AllRoutes<'a> {
//! #[flatten]
//! Marketing(MarketingRoutes),
//! #[flatten]
//! Api(ApiRoutes<'a>),
//! }
//!
//! // Construct an example http request, this would normally just be read off of a socket.
//! let request = b"GET /api/users/42?a=b HTTP/1.1\r\n\r\nContent-Length: 12\r\n\r\nHello World!";
//!
//! // Parse and and resolve the route
//! let route = AllRoutes::resolve(request);
//!
//! // For demonstration purposes, assert the resolved route is what we expect
//! assert!(matches!(route, Ok(RouterResult {
//! route: Some(AllRoutes::Api(ApiRoutes::GetUser { id: 42 })),
//! query: "a=b",
//! version: HttpVersion::OneOne,
//! head_and_body: b"Content-Length: 12\r\n\r\nHello World!",
//! })));
//!```
//!
//! For more advanced usage and examples, please refer to individual module documentation.
pub use *;
pub use *;